我们将时间戳转换为纪元,对它们进行一些数学运算,然后将它们转换回时间戳。数据库中的所有时间都是TIMESTAMP WITHOUT TIME ZONE
。
由于在英国时间切换到夏令时在一台服务器上关闭了一个小时但在另一台服务器上没有,所以我做了一点测试:
SHOW SERVER_VERSION;
SHOW TIMEZONE;
SELECT extract(EPOCH FROM TIMESTAMP '1970-01-01');
在一台服务器上我得到了
server_version
----------------
9.1.15
(1 row)
TimeZone
----------
GB
(1 row)
date_part
-----------
0
(1 row)
但另一方面
server_version
----------------
9.3.6
(1 row)
TimeZone
----------
GB
(1 row)
date_part
-----------
-3600
(1 row)
是否有可能导致此问题的服务器设置?
在Postgres 9.1之后,extract
的行为是否发生变化?
答案 0 :(得分:5)
是的,PostgreSQL 9.2版中extract
的行为发生了变化。来自the release notes:
让
EXTRACT(EPOCH FROM timestamp without time zone)
从当地午夜测量纪元,而不是UTC午夜(汤姆巷)此更改将恢复在7.3版中进行的考虑不周的更改。从UTC午夜测量是不一致的,因为它使得结果取决于
timezone
设置,timestamp without time zone
的计算不应该。通过将输入值强制转换为timestamp with time zone
来保持以前的行为。
这可能是造成差异的原因,因为根据the docs,
SQL标准要求只写
timestamp
等同于timestamp without time zone
,PostgreSQL会尊重这种行为。
正如@unique_id建议的那样,使用timestamp with time zone
(a.k.a。timestamptz
)应该消除不一致。