那些给出了正确的结果:
SET TIME ZONE '-04';
或SET TIME ZONE INTERVAL '-04:00';
SELECT current_setting('TIMEZONE'), now();
current_setting | now
-----------------+-------------------------------
-04:00:00 | 2014-10-29 06:45:35.694796-04
虽然这些都是倒置的:
SET TIME ZONE '-04:00';
SELECT current_setting('TIMEZONE'), now();
current_setting | now
-----------------+-------------------------------
-04:00 | 2014-10-29 14:52:25.322796+04
SET TIME ZONE '-04:00:00';
SELECT current_setting('TIMEZONE'), now();
current_setting | now
-----------------+-------------------------------
-04:00:00 | 2014-10-29 14:52:33.591539+04
我做错了什么?
答案 0 :(得分:2)
SET TIME ZONE
有3种形式(实际上是4种形式,有两种特殊值:LOCAL
& DEFAULT
);它可以接受:
另外,需要提一下,当您提供无效的时区缩写时,SET
语句将silently accept bogus input:
人们应该警惕POSIX风格的时区功能可以导致静默接受虚假输入,因为没有检查区域缩写的合理性。
选中此SQLFiddle,您可以看到:
SET TIME ZONE '-04'
会将时区偏移设置为数字(以小时为单位)SET TIME ZONE '-04:00'
将尝试使用其缩写设置时区,但会无声地失败SET TIME ZONE '-04:00:00'
也会尝试设置一个带有缩写的时区,并且会默默地失败,但是你会得到这个声明成功的意图,因为获取当前设置会给你的伪造时区缩写,也可以被解释为有效的(但事实并非如此)。始终使用直接号码或INTERVAL
字面值SET TIME ZONE
,或者最好:使用有效的时区缩写,例如America/New_York
。