2013-01-18 74 views
12

我在Active Record文檔中看到,您可以使用大於/小於比較來查詢日期。然而,如果你想選擇哪裏日期= Date.today,或者我必須查詢日期大於昨天還是小於明天?查詢where date = Date.today with Rails,MySQL和Active Record

正如你所看到的,我做的正是,在下面的查詢和查詢,其中日期=今天返回一個空集

1.9.3p286 :096 > Subscription.where("created_at = ?", Date.today).count 
    (0.5ms) SELECT COUNT(*) FROM `subscriptions` WHERE (created_at = '2013-01-18') 
=> 0 

1.9.3p286 :098 > Subscription.where("expiration_date < ? AND expiration_date > ?", Date.today + 1, Date.today - 1).count 
    (0.4ms) SELECT COUNT(*) FROM `subscriptions` WHERE (expiration_date < '2013-01-19' AND expiration_date > '2013-01-17') 
=> 1 

這是正確的方式查詢今天的日期還是我錯過了什麼?

回答

26

我覺得這是這個問題的一個DUP:

How to select date from datetime column?

Subscription.where("DATE(created_at) = ?", Date.today).count 

我敢肯定,這部作品在MySQL和PostgreSQL,但我不知道這是否是一個SQL標準。

維基百科似乎認爲TO_DATE將是標準: http://en.wikipedia.org/wiki/SQL#Date_and_time

這並沒有爲我在PostgreSQL的工作,雖然。

+1

謝謝!感謝您指出DUP。也許這個問題對於希望它在activerecord/Ruby中明確寫出的人來說仍然有用。 – jdkealy

11

我相信下面的帖子是更相關的給你 Rails ActiveRecord Find/Search by Date

在你的情況,當你與日期的ActiveRecord你可能想要把時區轉換成考慮搜索。

當您使用以下方法

Subscription.where("DATE(created_at) = ?", Date.today).count

它使用MySQL的日期函數來解析日期,你會得到UTC時間通過ActiveRecord的保存在MySQL。如果您的Rails應用程序正在使用其他時區,則會得到錯誤的結果。

使用此的正確方法是避免使用任何SQL函數,而是使用範圍。

Subscription.where(created_at: Date.today.beginning_of_day..Date.today.end_of_day)

這將取得與應用時區轉換的結果。 請讓我知道任何人都有更好的解決方案。

+0

我認爲這個答案沒有得到足夠的重視。我一直在使用DATE()一段時間,只有偶然的機會,而測試我發現了這種行爲。現在我必須回去並確保我的代碼的每個部分仍然按照其應該的方式運行。 – Tikiboy

+0

同意這可能是一個更好的方式來做它需要時區的帳戶。 –

0

對我來說只是工作原理是這樣:

@fisrt_payment_day = Invoice.where("DATE(date_first_payment) >= ?", Date.today - 1.day)