PostgreSQL:设置时区格式



这些给出了正确的结果:

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种,有两个特殊值:LOCALDEFAULT);它可以接受:

  • 文本中的时区缩写
  • 以数字表示的时区偏移(偏移实际上以小时为单位)
  • 间隔中的时区偏移

此外,需要注意的是,当您提供无效的时区缩写时,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

相关内容

  • 没有找到相关文章

最新更新