在不同的PostgreSQL服务器上提取时代的结果不同

时间:2015-04-09 10:54:53

标签: postgresql postgresql-9.1 postgresql-9.3

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

1 个答案:

答案 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)应该消除不一致。