2012-12-03 115 views
7

我正在嘗試搜索任何日期等於特定日期的模型,同時省略時間戳。在Rails我可以簡單地執行此作爲DateTime.to_date == somedate,但我不認爲它很容易在SQL制定我沒有在那裏就能夠將TO_DATE方法適用於整列像created_at:Rails 3日期時間比較w/ActiveRecord中的日期查詢

Foo.where("created_at == some_day_without_time_stamp").count 

起初,我認爲,因爲我使用的是PostgreSQL數據庫,我可以簡單地使用psql語法,但我更願意將它留給ActiveRecord來決定什麼是最適用的SQL,並保持我的代碼不知道數據庫供應商。這可能沒有任何額外的插件或寶石?

+1

您可以做created_at> = some_day_with_00:00:00 timestamp和create_at Tad

+0

@Tad顯然我可以,謝謝你的幫助。如果您將其作爲答案發布,我會接受它。 – Noz

+0

不客氣 - 回答下面添加 – Tad

回答

4

嘗試created_at >= some_day_with_00:00:00 timestamp and create_at < some_day_plus_one_with_00:00:00 timestamp

9

我會做這樣的事情......

someday = Date.today 
Foo.where(:created_at => (someday)..(someday + 1.day)) 

這將捕捉到午夜之間的所有created_at日期上somedaysomeday + 1。這是包容性的(所以它會包括Foo在+1天的午夜創建的爆炸聲),但可能對於您的需求而言「足夠好」,而不會混淆時間戳。

對於美好的事物,我會包起來作爲一個scope

scope :on_day, (lambda do |someday| 
    where(:created_at => (someday)..(someday + 1.day)) 
end) 

所以

Foo.on_day(Date.yesterday).count 

是很好的可讀性。

+0

你有一個,這可能會導致你每天計算兩次。這是我的修復: 'where(:created_at =>(someday)..(someday + 23.hours + 59.minutes + 59.seconds))' –

9

DateTime類有兩個有用的方法來做到這一點:beginning_of_dayend_of_day

對於這種情況,在你有一個Date對象,你可以這樣做:

Foo.where('created_at >= #{Date.today.to_time.beginning_of_day} AND 
      created_at <= #{Date.today.to_time.end_of_day}') 

請注意,您必須轉換Date對象爲DateTime對象

7

隨着範圍:

scope :on_day, (lambda do |day| 
    where(date: day.beginning_of_day..day.end_of_day) 
end) 

使用:

Foo.on_day(Date.today).count