PostgreSQL 中跨多个时区的总时差
Sum time differences across multiple timezones in PostgreSQL
假设我有一个包含两个 TIMESTAMPTZ
列的 table - start_time
和 end_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
假设我有一个包含两个 TIMESTAMPTZ
列的 table - start_time
和 end_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