PostgreSQL 中多个时区的时差总和

问题描述 投票:0回答:1

假设我有一个包含两列

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

但是当考虑到不同的时区时,我不确定如何实现这一点。主要担心的是我不想意外遗漏几行,因为它们位于与我的开始/结束不同的时区积分。

node.js postgresql timezone date-arithmetic
1个回答
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 时间戳。所以你的计算按原样进行。

所以,这是自动给定的:

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

相关:

© www.soinside.com 2019 - 2024. All rights reserved.