2011-08-19 115 views
4

我试图围绕Postgresql时区打印我的头,而且我似乎无法弄清楚这一点。 EST在美国是“东部标准时间”,通常是UTC-5在Postgresql中,如何在“时区”取消时区偏移量

实施例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再次... supposed to be UTC-5。现在,我通过文档搜索,它确实解释事情是“POSIX”,which is backwards。 (正偏移量在GMT以西,而负偏移量在GMT以东)。

但是,我该如何解决这个问题?在应用层,我总是可以将+符号反转为 - 符号,但对我来说这似乎有点混乱。因此,我的最终问题。

在数据库层(Postgres),有没有办法使用“At Time Zone”语法,以便GMT-5对应于EST?或者我只需要在应用程序层反转所有内容?

回答

2

用作写入documentation得到正确的行为间隔数据类型:

在这些表达式中,所需的时区zone可以指定 无论是作为一个文本串(例如,“PST”)或作为区间(例如, 区间'-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) 
+0

感谢。我无法在任何地方找到此功能。你知道你在哪里了解到这个吗? – Dragontamer5788

+0

@ Dragontamer5788:好的,我在http://postgresql.1045698.n5.nabble.com/Behavior-of-quot-at-time-zone-quot-td1928049.html –

+1

上发现了这个。您的链接有Postgresql文档的链接。哦,我想我只是没有阅读所有的手册。感谢您的链接,我想我会在下次更仔细阅读。 – Dragontamer5788