PostgreSQL 中跨多个时区的总时差

Sum time differences across multiple timezones in PostgreSQL

假设我有一个包含两个 TIMESTAMPTZ 列的 table - start_timeend_time.

在我的 JS 代码中,我将使用 momentjs 创建起点和终点,我想找到具有 [=13= 的所有行的所有时间差 (end_time - start_time) 的所有总和] 在这两点之间,无论每条记录的时区如何。

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

SELECT sum(EXTRACT(epoch from (end_time - start_time) / 3600)) as hours_used FROM table

但我不确定如何在考虑不同时区的情况下完成此操作。主要担心的是我不想意外遗漏几行,因为它们位于不同的时区我的 start/end 分。

您的查询有效原样,一旦您附加了一个 WHERE 子句来实现您想要的过滤器:

for all records with an end_time between those two points

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 包括 下限和上限,顺便说一句。

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

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

regardless of the timezone on each individual record.

相关:

  • Ignoring timezones altogether in Rails and PostgreSQL