如何将 UTC 格式的
timestamp
转换为 timestamptz
?
如果我的本地时区是 GMT-1 并且我运行:
select '2017-01-01 00:00:00'::timestamptz
我得到:
2017-01-01 00:00:00-01
但我想要:
2017-01-01 01:00:00-01
更好:
SELECT timestamp '2017-01-01 00:00:00' AT TIME ZONE 'UTC';
在
AT TIME ZONE
构造之后没有额外的转换。对于 timestamp with time zone
(= timestamptz
) 输入,它返回 timestamp without time zone
(= timestamp
),反之亦然。
对于给定的示例,提供时间戳常量的最短、最有效的方法是
timestamp '2017-01-01'
。或者使用石膏,几乎同样好:'2017-01-01'::timestamp
。缺失时假定时间分量 00:00:00
。
不存在“UTC 时间戳”这样的东西。 timestamp
不携带时区信息。只有您知道它
timestamptz
也不携带任何时区信息。给定的时区名称、缩写或偏移量用于计算相应的 UTC 时间。文本输出(显示)会根据您会话的当前时区设置进行调整。仅存储相应 UTC 时间的裸值。时区本身永远不会被存储。如果需要,请将其另外存储在另一列中。在您的特定情况下,UTC
碰巧也是用于输入的时区。 详细说明:
select ('2017-01-01 00:00:00' at time zone 'utc')::timestamptz