对于查询:

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

返回-184 daysTIMESTAMP值和-183 days -23:00:00TIMESTAMPTZ值。

对我来说,-184 days“似乎”是正确的,但总是被告知要使用TIMESTAMPTZ。哪个是正确的答案?

最佳答案

发布的答案是对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小时时差最有可能是来自夏时制和时区变化。

通常,我总是选择在系统中包括时区,以正确处理世界各地的时差,并避免因没有时区而引起的问题。客户端和服务器可能具有不同的时区,这可能会导致问题。

10-06 01:02