【问题标题】:Different results for extract epoch on different PostgreSQL servers在不同的 PostgreSQL 服务器上提取 epoch 的不同结果
【发布时间】:2015-04-09 19:19:03
【问题描述】:

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

【问题讨论】:

  • 猜测:试试SELECT extract(EPOCH FROM TIMESTAMP '1970-01-01'::timestamp with time zone);
  • 一般来说,在问题的上下文中更有意义的基础是'1970-01-01'::timestamp at time zone 'GMT'。从中提取纪元应该在 9.2 之前和 9.2 之后的版本中都可以正常工作

标签: postgresql postgresql-9.1 postgresql-9.3


【解决方案1】:

是的,extract 的行为在 PostgreSQL 版本 9.2 中发生了变化。来自the release notes:

  • EXTRACT(EPOCH FROM timestamp without time zone) 从本地午夜开始测量纪元,而不是 UTC 午夜 (Tom Lane)

    此更改恢复了在 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(又名timestamptz)应该可以消除不一致。

【讨论】:

  • 谢谢,使用::timestamp with time zone 作为@unique_id 建议在两台服务器上给我-3600。我们在一些计算后转换回时间戳,所以整个事情就像SELECT to_timestamp(extract(EPOCH FROM TIMESTAMP '1970-01-01'::timestamp with time zone))::timestamp without time zone。尝试了其他一些方法,extract(EPOCH FROM TIMESTAMP '1970-01-01' AT TIME ZONE 'UTC') 似乎也可以工作。
猜你喜欢
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多