【问题标题】:query where date = Date.today with Rails, MySQL, and Active Record使用 Rails、MySQL 和 Active Record 查询 where date = Date.today
【发布时间】:2013-01-18 17:18:47
【问题描述】:

我在 Active Record 文档中看到,您可以使用大于/小于比较来查询日期。但是,如果您想选择 where date = Date.today 或者我必须查询 date 大于昨天且小于明天的地方怎么办?

如您所见,我在以下查询中正是这样做的,并查询 Date = today 返回一个空集

1.9.3p286 :096 > Subscription.where("created_at = ?", Date.today).count
   (0.5ms)  SELECT COUNT(*) FROM `subscriptions` WHERE (created_at = '2013-01-18')
 => 0 

对比

1.9.3p286 :098 > Subscription.where("expiration_date < ? AND expiration_date > ?", Date.today + 1, Date.today - 1).count
   (0.4ms)  SELECT COUNT(*) FROM `subscriptions` WHERE (expiration_date < '2013-01-19' AND expiration_date > '2013-01-17')
 => 1 

这是查询今天日期的正确方法还是我错过了什么?

【问题讨论】:

    标签: ruby-on-rails-3 activerecord


    【解决方案1】:

    我认为这是这个问题的 DUP:

    How to select date from datetime column?

    Subscription.where("DATE(created_at) = ?", Date.today).count
    

    我很确定这适用于 MySQL 和 PostgreSQL,但我不确定它是否是 SQL 标准。

    维基百科似乎认为TO_DATE 将是标准: http://en.wikipedia.org/wiki/SQL#Date_and_time

    不过,这对我在 PostgreSQL 中不起作用。

    【讨论】:

    • 谢谢!并感谢您指出 DUP。也许这个问题对于希望在 activerecord / Ruby 中明确写出的人仍然有用。
    【解决方案2】:

    我相信以下帖子与您更相关 Rails ActiveRecord Find / Search by Date

    在您的情况下,当您使用 activerecord 搜索日期时,您可能需要考虑时区转换。

    当你使用下面的方法时

    Subscription.where("DATE(created_at) = ?", Date.today).count

    它使用 Mysql 的 DATE 函数来解析日期,您将获得由 activerecord 保存在 Mysql 中的 UTC 时间。如果您的 rails 应用程序使用其他时区,您将得到错误的结果。

    正确的使用方法是避免使用任何 SQL 函数,而是使用范围。

    Subscription.where(created_at: Date.today.beginning_of_day..Date.today.end_of_day)

    这将获取应用时区转换的结果。 请让我知道任何人对此有更好的解决方案。

    【讨论】:

    • 我认为这个答案没有得到足够的重视。我已经使用 DATE() 一段时间了,只是在测试时偶然发现了这种行为。现在我必须返回并确保我的代码的每一部分仍然正常运行。
    • 同意这可能是考虑时区的更好方法。
    【解决方案3】:

    对我来说就是这样:

    @fisrt_payment_day = Invoice.where("DATE(date_first_payment) >= ?", Date.today - 1.day)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多