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 进行强制转换,但假设我不执行任何操作,是否有任何文档描述字符串文字的情况?
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)
。