在Postgres SQL查询的WHERE子句中指定日期的时区

6
在Postgres中,我总是使用带有时区的时间戳存储日期。
为了讨论,假设我需要在2018-01-16以东部时区(EST -04)的时间(上午8点,下午1点和晚上10点)存储事件。数据库中的时间戳将是:
- 上午8点:"2018-01-16 12:00:00.000+00" - 下午1点:"2018-01-16 17:00:00.000+00" - 晚上10点:"2018-01-17 02:00:00.000+00"
如何编写Postgres SQL查询以获取所有发生在2018-01-16 EST的事件?
2个回答

11

AT TIME ZONE这个结构是你的好帮手:

WHERE CAST((tscol AT TIME ZONE 'EST') AS date) = DATE '2018-01-16'

2
SELECT fields, stamp FROM table WHERE stamp < '2018-01-16T00:00:00.000-04:00'

PostgreSQL接受ISO 8601格式和标准SQL格式。

您还可以使用=<=>=>BETWEEN,这是包含的。


等等,BETWEEN 包含两个端点吗?你能确定一下吗?因为我实际上已经尝试过多次,在没有时间的情况下将 date_from 和 date_to 列设置为相同日期进行 BETWEEN 操作,但是它并没有从具有该特定日期记录的表中显示任何结果。 - farisfath25
@farisfath25 “X BETWEEN ASYMMETRIC Y AND Z” 相当于 “X>=Y AND X<=Z”。 SYMMTETRIC/ASYMMETRIC 关键字支持是可选的,默认为 ASYMMETRIC。SQL-1999 第295页(印刷版第321页)。SQL-1992 “X BETWEEN Y AND Z” 相当于 “X>=Y AND X<=Z”。 - coladict
我明白了,感谢提供资源的信息。我想我在查询中犯了一些错误。 - farisfath25
此外,我刚刚在https://www.postgresql.org/docs/current/functions-comparison.html的PostgreSQL官方文档中查找了一下,它也说了相同的事情。(编辑:更改了URL) - farisfath25

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接