PostgreSQL中多个时区的时间差

时间:2018-04-02 17:42:47

标签: node.js postgresql timezone date-arithmetic

我们假设我的表格有两个TIMESTAMPTZ列 - start_timeend_time

在我的JS代码中,我将使用momentjs创建起点和终点,并且我希望找到{{1}的所有行的所有时差(end_time - start_time)的所有总和无论每条记录上的时区如何,这两点之间。

通常,如果表中的所有记录都使用相同的时区(例如UTC),我会做类似的事情:

end_time

但我不确定如何在考虑不同的时区时如何实现这一目标。主要担心的是我不想因为他们处于不同的时间而意外遗漏了几行区域比我的开始/结束点。

1 个答案:

答案 0 :(得分:1)

在您附加实现所需过滤器的WHERE子句后,您的查询有效

  

表示这两点之间end_time的所有记录

SELECT sum(EXTRACT(epoch from (end_time - start_time) / 3600)) as hours_used
FROM   tbl
WHERE  end_time BETWEEN $momentjs_start AND $momentjs_end;

$momentjs_start$momentjs_end是您创建的起点和终点,也应该是timestamptz。 (对于timestamp值,会话转换中假定会话的当前时区)。 BETWEEN 包括下限和上限,顺便说一句。

您的困惑可能是由于SQL标准委员会定义的数据类型timestamp with time zone(= timestamptz)的不幸名称 造成的。它实际上并不存储任何时区信息。 timestamptz文字中的时区偏移,缩写或名称仅用作输入/输出修改器以调整时区。在内部,存储纯UTC时间戳。所以你的计算工作原样。

所以,这是给定的,自动:

  

无论每条记录的时区如何。

相关: