不同 PostgreSQL 服务器上提取纪元的不同结果

2024-02-27

我们将时间戳转换为纪元,对它们进行一些数学计算,然后将它们转换回时间戳。数据库中的所有时间都是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)

是否有任何服务器设置可能导致此问题?

或者有以下行为extractPostgres 9.1 之后有变化吗?


是的,行为extractPostgreSQL 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(使用前将#替换为@)

不同 PostgreSQL 服务器上提取纪元的不同结果 的相关文章

随机推荐