2011-05-10 145 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