在采用时差时TIMESTAMP与TIMESTAMPTZ的正确值

时间:2018-05-23 21:55:40

标签: postgresql timestamp

对于查询:

SELECT '2018-03-01'::TIMESTAMP - '2018-09-01'::TIMESTAMP, 
       '2018-03-01'::TIMESTAMPTZ - '2018-09-01'::TIMESTAMPTZ;

返回-184 days的{​​{1}}和TIMESTAMP的{​​{1}}。

对我来说,-183 days -23:00:00"似乎"但是我总是被告知要使用TIMESTAMPTZ。哪个是正确的答案?

1 个答案:

答案 0 :(得分:5)

答案在OP的问题下作为评论讨论的补充发布。

数据类型timestamptz实际上是带时区的时间戳,而timestamp是没有时区的时间戳。

从减去这些特定日期得到的结果如下所示是正确的1小时差异

SELECT '2018-03-01'::TIMESTAMPTZ - '2018-09-01'::TIMESTAMPTZ;

这是因为2018-03-01::timestamptz+012018-09-01+02

使用此查询自行查看

SELECT '2018-03-01'::TIMESTAMPTZ, '2018-09-01'::TIMESTAMPTZ

1小时差异最有可能来自夏令时和随时间变化的时区。

一般情况下,我总是会选择在我的系统中加入时区来正确处理世界各地的时差,并避免因没有这个问题而产生的问题。客户端和服务器可能有不同的时区,可能会导致问题。