2014-10-29 65 views
1

那些给出一个正确的结果:PostgreSQL的:SET TIME ZONE格式化

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

我认为这是一个错误。这是因为POSIX时区与“正常”时区相反。请通过错误报告表单提出。 – 2014-10-29 12:00:56

+0

@CraigRinger根据下面的答案,你还认为这是一个错误?也许至少这种记录的行为值得一些改进,比如在没有识别POSIX风格的时区时提出警告,或者当我们想要使用POSIX风格时需要明确的格式化? – Victor 2014-10-30 15:45:21

+0

我认为这是一个记录的错误;-)。我知道POSIX时区处理很丑陋,但并没有意识到这是丑陋的。我们真的需要一个严格的模式。所以这不是新的,也没有必要报告,但是......糟糕。 – 2014-10-30 21:51:16

回答

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'也会尝试设置一个带有其缩写的时区并且会默默地失败,但是你会意识到这个语句是成功的,因为获取当前设置会给你你的虚假时区缩写,也可以解释为一个有效的缩写(但事实并非如此)。

始终使用直接数字或文字INTERVALSET TIME ZONE,优选:使用有效时区的缩写,像America/New_York

相关问题