如果我運行此查詢:
SELECT ('2021-11-02 08:00:00 00' AT TIME ZONE 'UCT') at TIME ZONE 'UCT 2';
它給出了這個結果:
2021-11-02 10:00:00 00
這對我來說似乎是正確的......
但是,我的時區資料采用字串格式,例如:“Africa/Johannesburg”,我知道它位于 UCT 2 時區。
但是運行這個查詢:
SELECT ('2021-11-02 08:00:00 00' AT TIME ZONE 'UCT') at TIME ZONE 'Africa/Johannesburg';
給出這個結果:
2021-11-02 06:00:00 00
這與我期望發生的相反。我知道我可以撰寫代碼將字串轉換為 UCT 值,但我不明白為什么字串值似乎與使用 UCT 值相反。有人可以解釋為什么會這樣嗎?
uj5u.com熱心網友回復:
哇,這里有很多東西要解壓。
主要的是(錯誤地參考 Inigo Montoya)我不認為這UTC 2意味著你認為它意味著什么。
這里的一件重要的事情是精確的格式。
你說你得到這個結果:
2021-11-02 06:00:00 00
但我得到的是:
2021-11-02 06:00:00
這真的很重要,因為我得到的不包括那個 00。那是因為它仍然08:00在 00時區中。
語法類似于“這個AT TIME ZONE地方的本地人會在這個特定的 UTC 時間看到什么?”。約翰內斯堡的某個人會將其視為 10:00。倫敦的某個人(在冬季)會將其視為 06:00。但它是同一時刻。
因此, 的輸出AT TIME ZONE通常不會 00包含與 UTC ( ) 的時區偏移量。
您的帶有兩個AT TIME ZONE子句的轉換是多余的。因為它知道它在那個時區,因此知道 UCT 時間是多少。你會用一個AT TIME ZONE子句得到相同的結果(試試看)。
您得到不同答案的原因似乎是因為 PostgreSQL 沒有解釋UCT 2為比 UCT 早 2 小時的 TimeZone。當您指定 POSIX 時區定義時,它會解釋這一點,其中還可能包括夏令時規則等。
此頁面:https ://www.postgresql.org/docs/current/datatype-datetime.html說 PostgreSQL 將接受以 3 種方式指定的時區:
- 全名 - 例如“非洲/約翰內斯堡”
- 縮寫 - 例如“SAST”
- Posix 格式,例如 'CET-1CEST,M3.5.0,M10.5.0/3' (這顯然是巴黎)
實際上,它不包括此頁面上的 Posix 格式示例:https ://www.postgresql.org/docs/current/datetime-posix-timezone-specs.html
基本上,posix 格式是一種指定時區規則的方式。
就像是
[abbreviation][offset][daylight savings abbrev][DST offset][dst rules]
所以說'UCT 2'可能是“錯誤的形式”,因為你試圖改變具有標準用法的縮寫'UTC'的含義。
您可以驗證它沒有使用您的時區的“UCT”部分來指代實際的UCT 時區。如果你這樣做:
SELECT ('2021-11-02 08:00:00 00' AT TIME ZONE 'BOB')
PostgreSQL 會說它不識別時區“BOB”。
但如果你這樣做
SELECT ('2021-11-02 08:00:00 00' AT TIME ZONE 'BOB 2')
它會很高興地給你06:00:00。事實上,如果你愿意,你可以(幾乎)在其中粘貼任何東西,而不是“UCT”。它不會在計算中使用。
請注意,我鏈接的posix頁面說
POSIX 時區規范不足以處理現實世界時區歷史的復雜性,但有時有理由使用它們。
最后,“UCT”是完全有效的,但它讓我很頭疼。我只看到它是“UTC”,所以 TIL。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/467480.html
標籤:PostgreSQL
上一篇:創建新的sql列以獲取新值
