【发布时间】:2016-12-11 16:10:20
【问题描述】:
我们使用的是 Postgresql 9.4,我在使用 date_trunc 时发现了一个奇怪的行为。结果中的时区偏移了1小时:
select date_trunc('year','2016-08-05 04:01:58.372486-05'::timestamp with time zone);
date_trunc
------------------------
2016-01-01 00:00:00-06
截断到例如day时没有这样的行为:
select date_trunc('day','2016-08-05 04:01:58.372486-05'::timestamp with time zone);
date_trunc
------------------------
2016-08-05 00:00:00-05
这是预期的行为吗?如果是这样,这背后的逻辑是什么?
【问题讨论】:
-
这很可能是因为夏令时规则:您当前的时区设置的偏移量在
2016-08-05和2016-01-01之间移动 -
哦。我没有想到这一点。你说的对。此外,我注意到 date_trunk 总是截断到在 postgres 上设置的时区,它没有考虑时间戳的时区。示例:
select date_trunc('year','2016-08-05 04:01:58.372486-05'::timestamp with time zone); => 2016-01-01 00:00:00+02 -
现在,这很奇怪......但是在浏览文档之后,似乎
date_trunc应该只接受timestamps,而不是timestamp with time zones(实际上,它应该通过剪切自动转换它们时区关闭)并返回timestamps。但相反,我在pg_catalog(默认架构)中找到了date_trunc(text, timestamp with time zone) returns timestamp with time zone定义,文档中根本没有提及。 -
所以我的意思是,这似乎是一个未记录的功能,因此最终用户不应该依赖它。如果您想要一个面向未来的解决方案,您应该将值转换为
timestamp (without time zone),或者在调用date_trunc之前使用ts AT TIME ZONE tz表达式。
标签: postgresql timezone postgresql-9.4