Postgres 如何处理时区比较?

how does Postgres handle timezone comparison?

寻求帮助理解 Postgres 时区转换和比较

查询

http://sqlfiddle.com/#!17/9eecb/79009

SELECT
    now()
    , ( now() at time zone 'AEDT' ) AS now_AEDT
    , ( ( now() at time zone 'AEDT' ) at time zone 'AEDT' ) AS now_AEDT_AEDT
    , ( now() at time zone 'UTC' ) + interval '1' second
      > ( now() at time zone 'AEDT' ) AS should_be_true

结果

now            : 2021-07-30T01:03:10.707834Z (i assume system is UTC?)
now_AEDT       : 2021-07-30T12:03:10.707834Z
now_AEDT_AEDT  : 2021-07-30T01:03:10.707834Z (why is this different?) 
should_be_true : false                       (after adding a second; this should be true, no?)

问题/困惑

  1. 为什么双重设置时区会改变时间? (now_AEDT_AEDT)
  2. 比较时如何处理带有时区的时间戳?似乎忽略了区域,只比较了值?

“在时区”应用于 timestamptz 与时间戳时做相反的事情。所以连续应用它两次只会让你回到原来的状态。首先它做了一些事情,然后它撤消了它。

当应用于 timestamptz 时,它将时间转换为看起来像在指定时区中表示的时间,并将其数据类型化为没有时区的时间戳(除了在 sqlfiddle 中,它似乎做了一些稍微不同的事情,但不改变整体效果)。当应用于没有时区的时间戳时,它假定表示的时间已经在指定的时区内,并将其转换回系统时间,并将其数据类型设置为 timestamptz。

how are timestamps with timezones handled in comparison? It seems the zone is ignored and just the values are compared?

您没有将时间戳与时区进行比较。您正在比较 没有 时区的时间戳。

select pg_typeof(now() at time zone 'AEDT');
          pg_typeof          
-----------------------------
 timestamp without time zone

所以是的,它忽略了您比较中的时区,因为它们不再存在了。