你必须另外保存时区偏移量 to the timestamp
.
正如@Milen 已经解释的那样(并链接到manual): a timestamp
只保存一个时间点(作为抽象值)。时区修改器是not已保存,仅用于调整timestamp
关系到UTC
.
考虑以下演示:
-- DROP TABLE tbl;
CREATE TEMP TABLE tbl (id int, myts timestamptz, mytz interval);
INSERT INTO tbl VALUES
(1, now() , EXTRACT (timezone from now()) * interval '1s')
,(2, '2012-01-01 00:00-05', interval '-5h')
,(3, '2012-01-01 00:00+04', interval '4h')
,(4, '2012-11-11 20:30+03', interval '3h');
SELECT *
,(myts AT TIME ZONE mytz)::text
|| CASE WHEN mytz > '0:0' THEN '+' ELSE '' END
|| to_char(mytz, 'FMHH24:mi') AS timestamp_at_origin
FROM tbl;
本地运行一下看看。特别注意细节在时区构造,以及如何从(本地!)timestamp with time zone
.
now()
回报timestamp with time zone
or timestamptz
简而言之。
EXTRACT (timezone from now()) * interval '1s'
timestamp_at_origin
显示时间戳和时区(如其来源所示)。如果我理解你的问题,那么这就是你正在寻找的。
您可以进一步改进格式。
您可能对此感兴趣相关问题这揭示了时区的模糊性和陷阱。