2014-10-29 66 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

相關問題