In Postgresql, how to un-invert the timezone offsets with “At Time Zone”
我正试图绕过Postgresql时区,我似乎无法弄清楚这一点。 EST是美国的"东部标准时间",通常为UTC-5。
实施例1:基础测试
1 2 3 4 | SELECT '08/31/2011 12:00 pm EST'::timestamptz at TIME zone 'EST'; timezone --------------------- 2011-08-31 12:00:00 |
示例2:偏移量为+5
1 2 3 4 | SELECT '08/31/2011 12:00 pm EST' at TIME zone '+5'; timezone --------------------- 2011-08-31 12:00:00 |
例3:偏移量为-5
1 2 3 4 | SELECT '08/31/2011 12:00 pm EST' at TIME zone '-5'; timezone --------------------- 2011-08-31 22:00:00 |
显然,一切都是倒退的。 EST再次......应该是UTC-5。 现在,我确实搜索了文档,它确实解释了事情是"POSIX",这是倒退。 (正偏移位于格林威治标准时间以西,而负偏移位于格林威治标准时间以东)。
但是,我该如何解决这个问题呢? 在应用程序层,我总是可以将+符号反转为 - 符号,但这对我来说似乎有些混乱。 因此,我的终极问题。
在数据库层(Postgres),有没有办法使用"At Time Zone"语法,以便GMT-5对应EST? 或者我只需要在应用层反转所有内容?
使用文档中所写的interval数据类型来获得正确的行为:
In these expressions, the desired time zone
zone can be specified
either as a text string (e.g., 'PST') or as an interval (e.g.,
INTERVAL '-08:00').
基础测试:
1 2 3 4 5 | SELECT '08/31/2011 12:00 pm EST'::timestamptz AT TIME ZONE 'EST'; timezone --------------------- 2011-08-31 12:00:00 (1 ROW) |
时区信息:
1 2 3 4 5 | SELECT * FROM pg_timezone_abbrevs WHERE abbrev LIKE 'EST'; abbrev | utc_offset | is_dst --------+------------+-------- EST | -05:00:00 | f (1 ROW) |
适当的偏移-5:
1 2 3 4 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:
1 2 3 4 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) |