【问题标题】:Rails/Postgres query all records created after 5 PM in taking into account daylight savings switch?Rails/Postgres 查询下午 5 点之后创建的所有记录,考虑夏令时开关?
【发布时间】:2017-08-10 05:08:13
【问题描述】:

我希望查询一张表上的所有记录,时间为下午 5 点之后的created_at,EST WITH 考虑到夏令时。

我的数据库是 Postgres,所有时间戳都作为普通的 Rails 应用程序存储在 UTC 中。

所以,假设我有四条记录

ID, created_at, time in EST (-5 offset from UTC),

1, "2017-01-01 22:46:21.829333", 5:46 PM
2, "2017-01-01 21:23:27.259393", 4:23 PM

-------- DST SWITCH -----

ID, created_at, time in EDT (-4 offset from UTC),

3, "2017-03-20 21:52:46.135713", 5:52 PM
4, "2017-06-21 20:08:53.034377", 4:08 PM

我的查询应该返回记录 1 和 3,但应该忽略 2 和 4。

我试过了

SELECT "id",
       "created_at"
FROM "orders"
WHERE (created_at::TIME WITHOUT TIME ZONE AT TIME ZONE 'utc' AT TIME ZONE 'US/Eastern' > ("created_at"::DATE + TIME '21:00')::TIME AT TIME ZONE 'utc' AT TIME ZONE 'US/Eastern')
ORDER BY "orders"."created_at" ASC

但是这个查询在不应该返回记录 2 时会返回记录 1,2,3。

【问题讨论】:

    标签: sql ruby-on-rails postgresql


    【解决方案1】:

    对不起,我之前的错误答案。美国时间我做的不多。


    所有时间戳都以 UTC 格式存储

    所以("created_at"::DATE + TIME '21:00')::TIME AT TIME ZONE 'utc' AT TIME ZONE 'US/Eastern'实际上说它是utc时间21:00,这并不一定保证它是EST中的5 PM,因为时区偏移量从5变为4。所以比较条件不正确。

    您需要获取本地时间来进行比较,而不是 UTC 时间。 试试下面的代码:

    SELECT
      "id",
      "created_at"
    FROM "orders"
    WHERE (created_at AT TIME ZONE 'utc' AT TIME ZONE 'US/Eastern') :: TIME > TIME '5:00 PM'
    

    【讨论】:

    • 获取本地时间!我以为我最初尝试过,但显然语法不正确。
    • 作为后续,TIME '5:00 PM' 演员表实际上是如何工作的,它是否使用数据库本身的当前时区?或者它是否以某种方式引用了早期创建的演员表到 UTC 然后到美国/东部。
    猜你喜欢
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 2013-09-15
    • 2013-09-22
    • 1970-01-01
    • 2023-04-06
    • 2020-08-30
    • 2018-01-01
    相关资源
    最近更新 更多