首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Postgresql选择输出日期和缺少时区偏移量

Postgresql选择输出日期和缺少时区偏移量
EN

Stack Overflow用户
提问于 2018-04-20 15:16:58
回答 2查看 1.9K关注 0票数 1

我很难处理postgresql和时区。

Postgresql服务器位于UTC时区中。我希望执行一个查询,返回中的日期,另一个带有时区偏移量的时区。

我可以执行一个查询,返回时区中的日期,但是我缺少时区偏移量

代码语言:javascript
运行
复制
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)

预期结果

代码语言:javascript
运行
复制
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)

你知道怎么做吗?

谢谢

EN

回答 2

Stack Overflow用户

发布于 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,无论当前时区如何,我都得到相同的结果。

票数 2
EN

Stack Overflow用户

发布于 2018-04-23 09:06:43

  • 某些时区在30或45分钟内有偏移。使用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?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49944856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档