2017-07-13 38 views
0

我可以欣赏我的Postgres语法中的第二双眼睛。Postgres SQL时区转换

数据库存储时间戳UTC。我试图从UTC转换为Eastern Daylight Time EDT,但输出不准确。

这里是我的语法:

SELECT 
to_char(((timestamp AT TIME ZONE 'UTC') AT TIME ZONE 'EDT'), 'MM/DD/YYYY HH24:MI') 
FROM table_name 

记录时间戳:

09/10/2016 12:00 

查询输出:

09/10/2016 16:00 

所需的输出:

09/10/2016 08:00 

感谢您的协助。

+0

使用'timestamptz'而不是'timestamp'。它们都是8个字节。 – Nick

回答

3

说出AT TIMEZONE两次是多余的,因为它只会从当前时区(您建议是UTC)转换为UTC然后转换为EDT。

事实上,你觉得有必要将其转换为UTC告诉我你并不是将它存储为TIMESTAMP WITH TIMEZONE。检查是否是这种情况。如果是这样,那可能是你的问题。 From the docs

如果没有时间段被输入字符串表示,那么它被认为是在由该系统的时区参数所表示的时间带,并使用被转换为UTC的时区区域中的偏移量。

基本上,如果你没有指定,默认情况下它是从你当前的时区开始,而不是UTC。您可能输入了UTC时间戳,并认为它是EDT。

+0

谢谢!除去第一个'AT TIMEZONE'的技巧。再次感谢您的洞察力 – emmanueledu