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?)
问题/困惑
- 为什么双重设置时区会改变时间? (now_AEDT_AEDT)
- 比较时如何处理带有时区的时间戳?似乎忽略了区域,只比较了值?
“在时区”应用于 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
所以是的,它忽略了您比较中的时区,因为它们不再存在了。
寻求帮助理解 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?)
问题/困惑
- 为什么双重设置时区会改变时间? (now_AEDT_AEDT)
- 比较时如何处理带有时区的时间戳?似乎忽略了区域,只比较了值?
“在时区”应用于 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
所以是的,它忽略了您比较中的时区,因为它们不再存在了。