sql - Rails/Postgres 在考虑夏令时开关的情况下查询下午 5 点之后创建的所有记录?

标签 sql ruby-on-rails postgresql

我想查询一个表中 created_at 时间在下午 5 点之后的所有记录,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

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

最佳答案

抱歉我之前的错误回答。我不太喜欢美国时间。


all timestamps are stored in 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'

关于sql - Rails/Postgres 在考虑夏令时开关的情况下查询下午 5 点之后创建的所有记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45492104/

相关文章:

SQL FOR XML 路径,返回多个子元素

python - 使用 fetchall() 时转换查询结果类型

带有伪行的 json_agg()

sql - 按周过滤查询

ruby-on-rails - RoR : PSQL to ruby - .加入

sql - Delphi ClientDataSet 通过改变 IndexName 进行排序

javascript - 如何将模型对象数组转换为以模型 ID 作为键的对象?

ruby-on-rails - Rails distance_of_time_in_words 返回 "en, about_x_hours"

css - 如何使用 Bower 在 Rails 应用程序中包含自己的 css 文件?

sql - 通过单次扫描对昂贵的表表达式进行多次选择