2010-02-17 58 views
1

我在命名範圍中遇到日期比較問題。我試圖根據它的開始和結束日期來確定事件是否是最新的。以下是我使用哪種作品的命名範圍,但不適用於具有相同開始和結束日期的事件。在Rails中進行日期比較

named_scope :date_current, :conditions => ["Date(start_date) <= ? AND Date(end_date) >= ?", Time.now, Time.now] 

這將返回以下的記錄,但它應該返回兩個記錄,沒有之一......

>> Event.date_current 
=> [#<Event id: 2161, start_date: "2010-02-15 00:00:00", end_date: "2010-02-21 00:00:00", ...] 

什麼它沒有返回本以及

>> Event.find(:last) 
=> #<Event id: 2671, start_date: "2010-02-16 00:00:00", end_date: "2010-02-16 00:00:00", ...> 

服務器時間似乎在UTC,我認爲這些條目以UTC存儲在數據庫中。任何想法,我做錯了什麼或嘗試什麼?

謝謝!

回答

0

最簡單的調試方法是查看您的rails日誌,看看究竟是 Rails正在生成哪些SQL語句。

然後發佈sql如果仍然有問題。

與此同時,我的猜測是某些東西沒有設置爲UTC。在哪裏設置{操作系統,rails環境,dbms}

補充:另外,爲什麼比較「日期」(在dbms中)和「時間」值(從您的語句)?最好讓類型類明確匹配。我使用新時間標準的時間組件00:00:00。這樣你就可以與數據庫進行比較,而不需要SQL中的日期函數。

+0

嗨拉里K.我昨天發現的是,第二個事件,我想要顯示DID顯示一天中的大部分時間,並且在UTC時間過去後似乎不再是當前事件。例如,從美國東部標準時間晚上8點開始,該事件不再是最新的,但是在美國東部時間下午5點,這確實使我認爲這是一個時區問題。以下是我的本地機器上查詢的開發日誌輸出: SELECT * FROM'events' WHERE((Date(start_date)<='2010-02-17 10:14:10'AND Date(end_date)> ='2010-02-17 10:14:10')AND(events.deleted_at IS NULL OR events.deleted_at>'2010-02-17 15:14:50')) – aressidi 2010-02-17 15:28:56

+0

我已更新date_current named_scope以查看現在這樣: named_scope:date_current,:conditions => [「Date(start_date)<=?AND Date(end_date)> =?」,Time.now.time_zone(「UTC」).to_date.to_s,Time。 now.in_time_zone( 「UTC」)。TO_DATE。to_s 這會在日誌中產生以下內容: SELECT * FROM'events' WHERE((Date(start_date)<='2010-02-17'AND Date(end_date)> ='2010-02-17') AND(events.deleted_at IS NULL OR events.deleted_at>'2010-02-17 15:22:44')) 也許時區需要爲+5小時而不是-5小時才能工作...... – aressidi 2010-02-17 15:30:52

1

我掙扎於同樣的問題。記錄以UTC格式存儲,但utc值未插入到查詢中。我像你一樣,通過手動將它轉換爲utc來解決它,就像這樣:time.utc

def find_production_since(start_time) 
    find(:all, :conditions => ["time > ?", start_time.utc]) 
end 
0

而不是使用Time.now(然後費力地轉換爲日期,按您的第二個評論)你可以只使用Date.today,將插入「2010-04-20」到SQL,並應與之比較的日期(start_date)而不用擔心時間。

1

這可能對你有幫助。

named_scope :date_current, :conditions => ["Date(start_date) <= Date(NOW()) AND Date(end_date) >= Date(NOW())"]