2011-05-10 148 views
25

我有一張交易表,需要查找日期與當天日期相符的記錄。查找符合今日日期的日期時間記錄 - Ruby on Rails

從rails控制檯,我需要匹配的日期字段看起來像這樣。我已經分配了一個記錄來處理測試。

ruby-1.9.2-p0 > deal.start 
=> Tue, 10 May 2011 00:00:00 UTC +00:00 

如果我試圖找到匹配的開始日期與今天類似這樣的任何記錄,我得到零

ruby-1.9.2-p0 > Deal.find_by_start(Date.today) 
=> nil 

然後我想我可以通過Date.today轉換爲日期時間相匹配。

ruby-1.9.2-p0 > Date.today.to_datetime 
=> Tue, 10 May 2011 00:00:00 +0000 
ruby-1.9.2-p0 > Deal.find_by_start(Date.today.to_datetime) 
=> nil 

我該如何得到這個工作?我使用Rails 3

編輯: 我想過他們倆轉換爲將工作,但試圖使用find_by_start方法時不

ruby-1.9.2-p0 > deal.start.strftime("%a, %e %B %Y") == Date.today.strftime("%a, %e %B %Y") 
=> true 

ruby-1.9.2-p0 > Deal.find_by_start.strftime("%a, %e %B %Y") == Date.today.strftime("%a, %e %B %Y") 
NoMethodError: undefined method `strftime' for nil:NilClass 

回答

46

記住一個DateTime持有一致的格式日期和時間,所以你正在尋找具有精確價值的記錄,而不僅僅是同一天。

您可以通過以下兩種方法之一來完成這一操作。您可以選擇從一天開始到結束的時間範圍,也可以創建date列以幫助更好地分組數據。

範圍的版本是這樣的:

@deals = Deal.where('start BETWEEN ? AND ?', DateTime.now.beginning_of_day, DateTime.now.end_of_day).all 

另外一個需要創建在您的表中的新start_date列,並與相應的日期填充它。您可以爲此日期編制索引並使查詢運行得更快,因爲範圍選擇對於大量數據集並非總是很快。

+0

謝謝。這很好,我將在短期內使用它,並着眼於重構我的代碼以提高性能。謝謝你的幫助。 – 2011-05-10 01:11:25

+12

還有一個更簡潔的版本使用範圍。 @deals = Deal.where(start:DateTime.now.beginning_of_day .. DateTime.now.end_of_day) – 2013-10-26 13:54:47

+0

我發現'Deal.where(start:Time.zone.now.midnight)'也適用。 – 2016-02-18 20:44:20

23

的Rails 5.1先後引進Date#all_day幫手,它返回給定日期範圍的對象,所以你可以這樣寫:

Deal.where(start: Date.today.all_day) 

您還可以使用SQL DATE()功能,爲您的目標,如:

@deals = Deal.where('DATE(start) = ?', Date.today) 
2

對於那些仍然在軌道4:

爲了增強上述not_a_patch的回答,我使用:

Deal.where(start: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day) 

因爲Time.zone將使用UTC(這是你的日期時間字段的存儲方式),同時DateTime.now不會。

> DateTime.now 
=> Fri, 08 Sep 2017 11:28:21 -0400 
> Time.zone.now 
=> Fri, 08 Sep 2017 15:29:53 UTC +00:00