我们将时间戳转换为纪元,对它们进行一些数学计算,然后将它们转换回时间戳。数据库中的所有时间都是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)
是否有任何服务器设置可能导致此问题?
或者有以下行为extract
Postgres 9.1 之后有变化吗?
是的,行为extract
PostgreSQL 9.2 版本中发生了变化。从发行说明: http://www.postgresql.org/docs/9.2/static/release-9-2.html#AEN112278
-
Make EXTRACT(EPOCH FROM timestamp without time zone) http://www.postgresql.org/docs/9.2/static/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT从当地午夜开始测量纪元,而不是 UTC 午夜 (Tom Lane)
此更改恢复了 7.3 版本中考虑不周的更改。从 UTC 午夜测量的结果不一致,因为它使得结果依赖于timezone http://www.postgresql.org/docs/9.2/static/runtime-config-client.html#GUC-TIMEZONE设置,其计算为timestamp without time zone
不应该是。通过将输入值转换为timestamp with time zone
.
这可能是造成差异的原因,因为根据the docs http://www.postgresql.org/docs/9.3/static/datatype-datetime.html,
SQL 标准要求只写timestamp
相当于timestamp without time zone
,并且 PostgreSQL 尊重这种行为。
正如@unique_id建议的那样,使用timestamp with time zone
(又名timestamptz
)应该消除不一致。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)