我很难处理postgresql和时区。
Postgresql服务器位于UTC时区中。我希望执行一个查询,返回中的日期,另一个带有时区偏移量的时区。
我可以执行一个查询,返回时区中的日期,但是我缺少时区偏移量
base=# SET timezone to 'utc';
SET
base=# select now();
now
------------------------------
2018-04-20 14:58:22.68038+00
(1 row)
base=# SET timezone to 'Europe/Paris';
SET
base=# select now();
now
-------------------------------
2018-04-20 16:58:29.614383+02
(1 row)
base=# SET timezone to 'utc';
SET
base=# select now() AT TIME ZONE 'Europe/Paris';
timezone
----------------------------
2018-04-20 16:59:03.146917 -- missing timezone offset here
(1 row)预期结果
base=# SET timezone to 'utc';
SET
base=# select now() AT TIME ZONE 'Europe/Paris'; --I'm missing something here, I guess
timezone
----------------------------
2018-04-20 16:59:03.146917+02 -- That's what I want
(1 row)你知道怎么做吗?
谢谢
发布于 2018-04-20 16:15:53
如果使用AT TIME ZONE,PG将返回一个没有时区的时间戳。如果将其转换为带有时区的时间戳,则会得到预期的结果:
SELECT (NOW() AT TIME ZONE 'Europe/Paris')::TIMESTAMPTZ;
结果:
2018-04-20 18:15:26.165+02
如何在不设置时区的情况下获得+02?问题是:NOW() AT TIME ZONE 'Europe/Paris'返回指定时区中的当前时间(没有偏移量),并将其转换回TIMESTAMPTZ,根据UTC给出当前时区( PG会话)的偏移量。因为'Europe/Paris‘是来自UTC的+02,如果您已经将时区设置为'Europe/Paris',那么在TIMESTAMPTZ中得到的偏移量是+02。如果当前时区设置为UTC,则偏移量为+00。
无论PG会话的时区设置是什么,如何获得偏移量,而不显式设置时区?我想有一种更好的方法来获得偏移量,但不知道偏移量,这里有一种方法:计算偏移量,格式化偏移量,并将其附加到没有时区的时间戳中。
SELECT (NOW() AT TIME ZONE 'Europe/Paris')::TEXT || TO_CHAR(EXTRACT(hour FROM NOW() AT TIME ZONE 'Europe/Paris' - NOW() AT TIME ZONE 'UTC'), 'FMSG00')
结果:2018-04-21 15:12:42.658+02,无论当前时区如何,我都得到相同的结果。
发布于 2018-04-23 09:06:43
TO_CHAR(EXTRACT(hour FROM NOW() AT TIME ZONE 'Europe/Paris' - NOW() AT TIME ZONE 'UTC')排除此用例。SET LOCAL TIME ZONE 'Europe/Paris';吗?根据文件:如果在对同一变量具有SET选项的函数中使用SET LOCAL (请参阅CREATE函数),则SET本地命令的效果在函数退出时消失
另一个答案似乎符合您的要求:How to convert timestamp field to ISO 8601 string in a given time zone?
https://stackoverflow.com/questions/49944856
复制相似问题