【问题标题】:Find Records with Datetime that match today's date - Ruby on Rails查找日期时间与今天匹配的记录 - Ruby on Rails
【发布时间】:2011-05-10 00:22:32
【问题描述】:

我有一个交易表,需要查找日期与今天匹配的记录。

在 Rails 控制台中,我需要匹配的日期字段如下所示。我已经指定了一个记录来处理测试。

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

如果我像这样尝试查找与今天匹配的开始日期的任何记录,我会得到 nil

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

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    Rails 5.1 引入了Date#all_day 助手,它返回给定日期的范围对象:

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

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

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

    【讨论】:

    • 如果你意识到你熬夜调试太晚了,“今天”现在实际上是“昨天”(或任何其他给定日期),Deal.where(start: Date.parse("YYYY-MM-DD").all_day) 也可以解决问题。跨度>
    【解决方案2】:

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

    您可以通过以下两种方式之一进行操作。您可以选择从一天开始到结束的时间范围,也可以创建一个date 列来帮助更好地对数据进行分组。

    范围版本如下所示:

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

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

    【讨论】:

    • 谢谢。这很好用,我将在短期内使用它,并考虑重构我的代码以提高性能。感谢您的帮助。
    • 还有一个使用范围的更简洁的版本。 @deals = Deal.where(start: DateTime.now.beginning_of_day.. DateTime.now.end_of_day)
    • 我发现Deal.where(start: Time.zone.now.midnight) 也有效。
    【解决方案3】:

    对于仍在使用 Rails 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
    

    【讨论】:

      猜你喜欢
      • 2011-04-03
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      相关资源
      最近更新 更多