2010-08-25 65 views
0

我想獲取日期在日期範圍內的模型。 所以我想這樣做如何將字符串與find子句中的日期進行比較?

MyModel.find_all_by_field1_id_and_field2_id(value1, value2, :conditions => { :date => nb_days_ago..Date.yesterday })

的事情是,我的模型的日期屬性是一個字符串(格式爲「2010年8月24日」),而我不能修改這個。 所以把它比我的日期範圍,我嘗試這樣做:

MyModel.find_all_by_field1_id_and_field2_id(value1, value2, :conditions => { Date.strptime(:date, "%m-%d-%Y") => nb_days_ago..Date.yesterday })

但我得到的,基本上說,strptime不能處理的錯誤:日期符號。我認爲我的解決方案不好。

如何將我的字符串與我的日期範圍進行比較?

謝謝

+0

什麼數據庫,你使用MySQL,SQLite的?數據庫DATETIME,VARCHAR等中的日期字段的數據類型是什麼? – drummondj 2010-08-25 20:43:30

+0

日期字段是VARCHAR(255)和數據庫是SQLite – 2010-08-25 21:36:24

回答

0

首先我不羨慕你的情況。這是一個相當醜陋的日期格式。我能想到的唯一的事情就是以這種格式生成一個字符串數組,表示從開始日期到結束日期之間的所有日期,然後使用SQL「IN」語法查找該集合中的日期(您可以從ActiveRecord的:conditions參數中執行)。

例如,如果你想搜索到10天前:

num = 10 #number of days ago for search range 
# range starts at 1 because you specified yesterday 
matching_date_strings = (1..num).to_a.map{|x| x.days.ago.strftime("%m-%d-%Y")} 
=> ["08-24-2010", "08-23-2010", "08-22-2010", "08-21-2010", "08-20-2010"] 
# then... 
records = MyModel.all(:conditions => { :date => matching_date_strings }) 
# or in your case with field1 and field2 
records = MyModel.find_all_by_field1_id_and_field2_id(value1, value2, :conditions => { :date => matching_date_strings }) 

的想法是這應該生成SQL的東西,如」 ... WHERE日期(‘2010年8月24日’, 「08-23-2010」,「08-22-2010」,「08-21-2010」,「08-20-2010」)

+0

謝謝,我用你的解決方案作爲一個快速修復。 – 2010-08-26 00:12:45

0

您必須將數據庫字符串轉換爲數據庫中的日期而不是在Ruby代碼中:

Model.all(:conditions => [ "STR_TO_DATE(date,'%m-%d-%Y') BETWEEN ? AND ? ", 
       nb_days_ago, Date.yesterday]) 

更好的解決方法是通過添加規範化模型一個陰影場。

Model.all(:conditions => {:date_fld => nb_days_ago..Date.yesterday}) 

不要忘記在date_fld列中添加索引:現在

class Model 

    after_save :create_shadow_fields 
    def create_shadow_fields 
    self.date_fld = Date.strptime(self.date_str, "%m-%d-%Y") 
    end 
end 

查詢可以按如下方式寫入。

編輯1

對於SQLLite,第一個解決方案可以改寫如下:

Model.all(:conditions => [ "STRFTIME('%m-%d-%Y', date) BETWEEN ? AND ? ", 
       nb_days_ago, Date.yesterday]) 
+0

STR_TO_DATE不被sqlite3識別。 第一種解決方案不適用於STRFTIME:我沒有得到任何結果。 – 2010-08-26 00:03:15

+0

代碼中有語法錯誤。我已經更新了我的答案,看看。 – 2010-08-26 00:10:05

相關問題