使用时区减去两列类型为timestamp的列

时间:2018-05-07 22:26:24

标签: postgresql

我正在将某些列类型从TIMESTAMP WITHOUT TIME ZONE转换为TIMESTAMP WITH TIME ZONE

系统中已存在的某些函数通过简单地执行以下操作来计算两个时间戳之间的差异:timestamp1 - timestamp2。

我想知道在处理时区时这种方法是否正确。 我正在考虑的解决方案如下:

timestamp1 at time zone 'America/Sao_Paulo' - timestamp2 at time zone 'America/Sao_Paulo'

但问题是:这种方法正确处理DST更改?用这种方式减去带时区的时间戳是安全的吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

这不安全。考虑这个例子:

ThirdChildViewController

这是因为这些不同的绝对时间戳在该时区看起来相同。使用SELECT TIMESTAMPTZ '2018-02-18 02:00:00+00' AT TIME ZONE 'America/Sao_Paulo' - TIMESTAMPTZ '2018-02-18 01:00:00+00' AT TIME ZONE 'America/Sao_Paulo'; ?column? ---------- 00:00:00 (1 row) 的日期算术不正确,因为差异取决于时区。

要查找两个timestamp without time zone值之间的经过时间,只需减去它们:

timestamp with time zone

结果总是正确的,因为使用了绝对时间。