首页 文章

PostgreSQL中多个时区的时间差

提问于
浏览
2

假设我有一个包含两个 TIMESTAMPTZ 列的表 - start_timeend_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 回答

  • 1

    一旦附加了实现所需过滤器的 WHERE 子句,您的查询就有效 as is

    对于具有这两点之间的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 包括下限和上限,顺便说一句 .

    您的困惑可能是由SQL标准委员会定义的数据类型 timestamp with time zone (= timestamptz )的 unfortunate name 引起的 . 它实际上并不存储任何时区信息 . timestamptz literals中的时区偏移,缩写或名称仅用作输入/输出修改器以调整时区 . 在内部,存储纯UTC时间戳 . 所以你的计算工作原理 .

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

    无论每个记录的时区如何 .

    有关:

相关问题