在PostgreSQL中的多个时区之间的总和时间差异



假设我有一个带有两个TIMESTAMPTZ列的表 - start_timeend_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中完全忽略时带
  • 数据类型中的时区存储"时间戳与时区"

相关内容

  • 没有找到相关文章

最新更新