我必须读取诸如'20190608070000'之类的字符串作为UTC中给出的时间戳。有没有简单的方法可以做到这一点?
这需要UTC,但需要格式化输入:
postgres=# show time zone;
TimeZone
----------
CET
(1 Zeile)
postgres=# select timestamp without time zone '2019-06-08 07:00:00' at time zone 'UTC';
timezone
------------------------
2019-06-08 09:00:00+02
(1 Zeile)
据我所知,to_timestamp()始终将所有输入视为本地时间,因此输出被错误地移位:
postgres=# SELECT to_timestamp('20190608070000', 'YYYYMMDDHH24MISS') AT time zone 'UTC';
timezone
---------------------
2019-06-08 05:00:00
(1 Zeile)
实际上我正在使用PostgreSQL 9.6。
答案 0 :(得分:1)
TO_TIMESTAMP
的返回类型为timestamp with time zone
。显示的时间是您当前会话的时区(带有UTC偏移)。
SET SESSION timezone TO 'CET';
SET
knayak=# SELECT to_timestamp('20190608070000', 'YYYYMMDDHH24MISS');
to_timestamp
------------------------
2019-06-08 07:00:00+02
当您使用AT TIME ZONE
进行转换时,它将以UTC表示当前时区中07:00
小时的时间。
SELECT to_timestamp('20190608070000', 'YYYYMMDDHH24MISS') AT time zone 'UTC';
timezone
---------------------
2019-06-08 05:00:00
(1 row)
因此,如果您希望以所需的格式读取时间戳并将其视为UTC,请将to_timestamp
的输出显式转换为timestamp
(无时区),然后应用{{1} }。
AT TIME ZONE