【问题标题】:Problem with Time Comparison in Rails AR QueryRails AR查询中的时间比较问题
【发布时间】:2011-07-11 01:01:38
【问题描述】:

我正在运行带有 PostgreSQL 数据库的 Rails 3.0.4,并创建了一个名为 ordered_at 的 DateTime 字段。

我通过使用 Time.now 进行创建来设置它,我想使用 where("ordered_at > ?", params[:later_than] 之类的东西查询 ordered_at 字段,但如果我输入的时间晚于 1.minute.from_now 之类的东西,我会得到没有结果的结果应该是。

详细说明:ordered_at2011-03-08 11:11:49params[:later_than]2011-03-08 11:09:58 UTC

我认为这是因为 Time 对象中的时区在数据库中不存在(ordered_At 字段是 timestamp without time zone 数据类型)。

有没有人遇到同样的问题可以帮助我?

【问题讨论】:

  • 您能否检查日志并将由此生成的 SQL 查询粘贴到此处?
  • SQL 看起来像这样:SELECT COUNT(*) FROM "course_orders" WHERE "course_orders"."finished" = 't' AND (DATE(ordered_at) = '2011-03-08') AND (ordered_at > '2011-03-08 12:16:09.708236' )。一个提示:我正在为测试生成我的数据
  • 所以这是我的固定装置之一:course_order_for_today_order_of_hans: ordered_at: <%= Time.now - 1.hour %> 这会将时间设置为有点不在 UTC
  • @leons...<%= Time.now.utc - 1.hour %> 可能会起作用。

标签: ruby-on-rails ruby activerecord time comparison


【解决方案1】:

修复它。 万恶之源在我的装置中。

你必须像这样在你的灯具中设置时间:

  ordered_at: <%= (30.minutes.ago).iso8601 %>

否则你会得到数据库/服务器的时区

【讨论】:

    【解决方案2】:

    您必须记住的是,Rails 以 UTC 格式将时间存储在您的数据库中。 Rails 将时间转换为 UTC 并将其设置为在数据库中查看的标准。因此,如果您将params[:later_than] 设置为2011-03-08 11:11:49 UTC 或任何时间与任何时区,Rails 将在插入 SQL 查询之前将其转换为 UTC 时区。如果您将 Time.now 保存到数据库中,Time.now 将是服务器时间或本地机器时间以及机器设置的时区。在保存到数据库之前,Rails 会将其转换为 UTC 并保存。因此,在数据库级别,所有内容都将转换为 UTC,然后进行比较以避免混淆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-05
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      相关资源
      最近更新 更多