在PostgreSQL中,如何使用“At Time Zone”取消倒置的时区偏移量

7
我是一个有用的助手,可以翻译文本。

我正在努力理解Postgresql时区,但似乎无法弄清楚。 EST在美国是“东部标准时间”,通常为UTC-5

示例1:基础测试

select '08/31/2011 12:00 pm EST'::timestamptz  at time zone 'EST';
      timezone       
---------------------
 2011-08-31 12:00:00

例子2:偏移量为+5
select '08/31/2011 12:00 pm EST' at time zone '+5';
      timezone       
---------------------
 2011-08-31 12:00:00

示例3:偏移量为-5

 select '08/31/2011 12:00 pm EST' at time zone '-5';
      timezone       
---------------------
 2011-08-31 22:00:00

显然,一切都是相反的。EST应该是UTC-5,但现在不是。我查阅了文档,它解释了一些“POSIX”,这是相反的。(正偏移在GMT西边,负偏移在GMT东边)。

然而,我该怎么办呢?在应用层,我总是可以将+号反转为-号,但我认为这有点混乱。因此,我的最终问题是:

在数据库层面(Postgres),是否有一种使用“At Time Zone”语法的方式,使GMT-5对应于EST?还是我只能在应用程序层面上反转一切?

1个回答

4
使用文档中所述的间隔数据类型来获取正确的行为:

在这些表达式中,所需的时区zone可以指定为文本字符串(例如,“PST”)或作为间隔(例如,INTERVAL '-08:00')。

基础测试:

SELECT '08/31/2011 12:00 pm EST'::timestamptz AT TIME ZONE 'EST';
      timezone       
---------------------
 2011-08-31 12:00:00
(1 row)

时区信息:

SELECT * FROM pg_timezone_abbrevs WHERE abbrev LIKE 'EST';
 abbrev | utc_offset | is_dst 
--------+------------+--------
 EST    | -05:00:00  | f
(1 row)

正确的偏移量为-5:

SELECT '08/31/2011 12:00 pm EST'::timestamptz AT TIME ZONE '-05:00'::interval;
      timezone       
---------------------
 2011-08-31 12:00:00
(1 row)

正确的偏移量 +5:

SELECT '08/31/2011 12:00 pm EST'::timestamptz AT TIME ZONE '+05:00'::interval;
      timezone       
---------------------
 2011-08-31 22:00:00
(1 row) 

谢谢。我找不到这个功能的文档。你知道你是从哪里学到的吗? - Dragontamer5788
@Dragontamer5788:好的,我在http://postgresql.1045698.n5.nabble.com/Behavior-of-quot-at-time-zone-quot-td1928049.html上找到了这个。 - Grzegorz Szpetkowski
1
哈哈,你提供的链接里有Postgresql文档的链接。我想我只是没有仔细阅读手册。谢谢你提供的链接,下次我会更加仔细地阅读。 - Dragontamer5788

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接