为什么没有时区信息的字符串文字 '2021-02-16 09:00' 被解释为带有 AT TIME ZONE 的“带有时区的时间戳”?

问题描述 投票:0回答:1

set timezone = 'Asia/Ho_Chi_Minh';

我将显示时间设置为 GMT+7。

select '2021-02-16 09:00' AT TIME ZONE 'Asia/Singapore';
select '2021-02-16 09:00+06' AT TIME ZONE 'Asia/Singapore';

输出

2021-02-16 10:00:00
2021-02-16 11:00:00

因为

AT TIME ZONE
timestamp without time zone
转换为
timestamp with time zone
,反之亦然(https://www.postgresql.org/docs/current/functions-datetime.html#FUNCTIONS-DATETIME-ZONECONVERT),并且因为两个输出是
timestamp without time zone
(你可以看到它们没有 + - 部分,或者
pg_typeof
来确认),我推断两个字符串文字都被解释为
timestamp with time zone

我知道第二个选择有

+06
部分来指示时区,这是有意义的。

问题

为什么第一个没有 + 或 - 时区部分的选择会像第二个选择一样被解释为

timestamp with time zone


我知道我可以使用 TIMESTAMP/TIMESTAMP WITH TIME ZONE 指定类型或使用 ::timestamp/::timestamptz 进行强制转换,但假设我不执行任何操作,是否有任何文档描述字符串文字的情况?

postgresql timezone timestamp-with-timezone
1个回答
0
投票

select '2021-02-16 09:00' AT TIME ZONE 'Asia/Singapore';
中的字符串文字(即
'2021-02-16 09:00'
部分)被解释为具有时区,因为您将时区设置为
'Asia/Ho_Chi_Minh'

PostgreSQL 将

'2021-02-16 09:00'
视为
2021-02-16 09:00
中的
Asia/Ho_Chi_Minh time zone (UTC+7)

© www.soinside.com 2019 - 2024. All rights reserved.