假设我有一个包含两个 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
但是当我考虑不同的时区时,我不确定如何实现这一目标 . 主要担心的是我不想意外遗留几行,因为他们在与我的起点/终点不同的时区 .
1 回答
一旦附加了实现所需过滤器的
WHERE
子句,您的查询就有效 as is :$momentjs_start
和$momentjs_end
是您创建的起点和终点,也应该是timestamptz
. (对于timestamp
值,会话转换中假定会话的当前时区) .BETWEEN
包括下限和上限,顺便说一句 .您的困惑可能是由SQL标准委员会定义的数据类型
timestamp with time zone
(=timestamptz
)的 unfortunate name 引起的 . 它实际上并不存储任何时区信息 .timestamptz
literals中的时区偏移,缩写或名称仅用作输入/输出修改器以调整时区 . 在内部,存储纯UTC时间戳 . 所以你的计算工作原理 .所以,这是给定的,自动的:
有关:
Ignoring timezones altogether in Rails and PostgreSQL
Time zone storage in data type "timestamp with time zone"