这些给出了正确的结果:
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
我做错了什么?
SET TIME ZONE
有3种形式(实际上是4种,有两个特殊值:LOCAL
和DEFAULT
);它可以接受:
- 文本中的时区缩写
- 以数字表示的时区偏移(偏移实际上以小时为单位)
- 间隔中的时区偏移
此外,需要注意的是,当您提供无效的时区缩写时,SET
语句将静默地接受伪输入:
应该注意的是,POSIX风格的时区功能可能会导致无声地接受虚假输入,因为没有检查区域缩写的合理性。
检查这个SQLFiddle,你可以看到:
SET TIME ZONE '-04'
将时区偏移设置为数字(以小时为单位)SET TIME ZONE '-04:00'
将尝试用其缩写设置时区,但会无声地失败SET TIME ZONE '-04:00:00'
也会尝试用它的缩写设置时区,但会默默地失败,但你会得到这个语句成功的意图,因为获得当前设置会给你伪造的时区缩写,它也可以被解释为有效的时区缩写(但事实并非如此)
始终使用一个直接数字,或INTERVAL
文字与SET TIME ZONE
,或者最好使用有效的时区缩写,如America/New_York
。