PostgreSQL:SET TIME ZONE格式化

时间:2014-10-29 11:10:22

标签: postgresql timezone

那些给出了正确的结果:

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

我做错了什么?

1 个答案:

答案 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