Rails/Postgres 查询下午 5 点之后创建的所有记录,以考虑夏令时开关?



我希望查询表上created_at时间在东部时间下午 5 点之后的所有记录,同时考虑到夏令时。

我的数据库是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。

对不起我之前的错误答案。我对美国时间没有太多帮助。


所有时间戳都以 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'

最新更新