使用与今天的日期匹配的日期时间查找记录 - Ruby on Rails

Rob*_*t B 30 ruby ruby-on-rails

我有一个交易表,需要查找日期与今天的日期相符的记录.

在rails控制台中,我需要匹配的日期字段如下所示.我已经分配了一份记录来处理测试.

ruby-1.9.2-p0 > deal.start
=> Tue, 10 May 2011 00:00:00 UTC +00:00 
Run Code Online (Sandbox Code Playgroud)

如果我尝试找到与今天的开始日期相匹配的任何记录,那么我就是零

ruby-1.9.2-p0 > Deal.find_by_start(Date.today)
=> nil
Run Code Online (Sandbox Code Playgroud)

然后我认为我可以通过将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
Run Code Online (Sandbox Code Playgroud)

我怎样才能让它发挥作用?我正在使用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
Run Code Online (Sandbox Code Playgroud)

Ily*_*lya 51

Rails 5.1引入了Date#all_dayhelper,它返回给定日期的范围对象,因此您只需编写:

Deal.where(start: Date.today.all_day)
Run Code Online (Sandbox Code Playgroud)

您还可以使用SQL DATE()函数来实现目标,例如:

@deals = Deal.where('DATE(start) = ?', Date.today)
Run Code Online (Sandbox Code Playgroud)

  • 而且,如果您意识到调试工作太晚了,而“今天”实际上是“昨天”(或任何其他给定的日期),请使用Deal.where(start:Date.parse(“ YYYY-MM-DD”)。 all_day)`也可以解决问题。 (4认同)

tad*_*man 49

请记住,DateTime包含日期和时间,因此您正在查找具有精确值的记录,而不仅仅是同一天.

你可以用两种方法之一做到这一点.您可以选择从一天开始到结束的时间范围,也可以创建一个date列来帮助更好地分组数据.

范围版本如下所示:

@deals = Deal.where('start BETWEEN ? AND ?', DateTime.now.beginning_of_day, DateTime.now.end_of_day).all
Run Code Online (Sandbox Code Playgroud)

另一个需要start_date在表中创建一个新列,并相应地填充日期.您可以将此日期编入索引,并使查询运行得更快,因为对大型数据集的范围选择并不总是很快.

  • 还有一个更简洁的版本使用范围.@deals = Deal.where(开始:DateTime.now.beginning_of_day .. DateTime.now.end_of_day) (13认同)

小智 5

对于那些仍然在Rails 4上的人:

为了增加上面的not_a_patch的答案,我会使用:

Deal.where(start: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
Run Code Online (Sandbox Code Playgroud)

因为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
Run Code Online (Sandbox Code Playgroud)