假设我有一个包含两列
TIMESTAMPTZ
的表格 - start_time
和 end_time
。
在我的JS代码中,我将使用momentjs创建起点和终点,并且我想找到这两个点之间具有
end_time - start_time
的所有行的所有时间差的总和(end_time
),无论每个单独记录上的时区。
通常,如果表中的所有记录都使用相同的时区(例如 UTC),我会这样做:
SELECT sum(EXTRACT(epoch from (end_time - start_time) / 3600)) as hours_used FROM table
但是当考虑到不同的时区时,我不确定如何实现这一点。主要担心的是我不想意外遗漏几行,因为它们位于与我的开始/结束不同的时区积分。
您的查询是有效的原样,一旦您附加实现所需过滤器的
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 时间戳。所以你的计算按原样进行。
所以,这是自动给定的:
无论每条记录的时区如何。
相关: