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_day
helper,它返回给定日期的范围对象,因此您只需编写:
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)
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
在表中创建一个新列,并相应地填充日期.您可以将此日期编入索引,并使查询运行得更快,因为对大型数据集的范围选择并不总是很快.
小智 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)
归档时间: |
|
查看次数: |
26234 次 |
最近记录: |