假设我有一个带有两个TIMESTAMPTZ
列的表 - start_time
和 end_time
。
在我的JS代码中,我将使用MomentJS创建起点和终点,我想找到所有在这两个点之间使用end_time
的所有行差异的总和(end_time - start_time
(每个单独的记录。
通常,如果表中的所有记录都使用相同的时区(例如UTC(,我会做类似的事情:
SELECT sum(EXTRACT(epoch from (end_time - start_time) / 3600)) as hours_used FROM table
但是我不确定在考虑不同的时区时如何完成此操作。主要关心的是我不想偶然地排除几行,因为它们与我的开始不同/终点。
您的查询有效 as ,一旦您附加了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
包括下限和上限,btw。
您的混乱可能是由于SQL标准委员会定义的数据类型timestamp with time zone
(= timestamptz
(的不幸的名称。它实际上并未存储任何时区信息。timestamptz
中的时区偏移,缩写或名称仅作为输入/输出修饰符,以调整时区域。在内部,普通UTC时间戳存储。因此您的计算可以按原样运行。
所以,这是一个给定的,自动:
不论每个单独记录上的时区。
相关:
- 在Rails和Postgresql中完全忽略时带
- 数据类型中的时区存储"时间戳与时区"