這應該很簡單,但我有一個令人尷尬的數量的麻煩。有沒有一種簡單而乾淨的方法可以在UTC的午夜時間將`DATE`轉換爲該日期的`TIMESTAMP AT TIME ZONE`?
在PostgreSQL 9.1中,我需要在DB中解釋一個存儲爲DATE
的字段,就好像它是代表該日期的午夜UTC的TIMESTAMPTZ
一樣。我希望以一種乾淨可讀的方式做到這一點,即有人可以前來參觀,瞭解發生的事情。
到目前爲止我發現的唯一方法是非常難看。一個將其轉換爲TIMESTAMP WITHOUT TIME ZONE
通過解釋它,就好像它是UTC創建一個從它TIMESTAMP WITH TIME ZONE
:
SELECT CAST(DATE '2012-01-01' AS TIMESTAMP WITHOUT TIME ZONE) AT TIME ZONE 'utc'
另一種方式是更糟:
('2012-01-01'::date)::timestamptz - (current_timestamp AT TIME ZONE 'UTC' - current_timestamp)
,它的日期轉換爲時間戳本地時間午夜,然後減去時區偏移量。我無法找到任何方法將本地時間間隔作爲間隔(這看起來很瘋狂),所以我通過比較本地時間的current_timestamp
與UTC中的current_timestamp
來得到它。
我唯一能解決的另一個方法是使用extract
來獲取日期部分並從它們中組裝一個新的timestamptz
。我甚至不會表明那個,這太難看了。
這兩種方法都會感到各種奇怪和錯誤。有沒有什麼合理的方法 - 標準的還是沒有的 - 在當天UTC的午夜時間以易讀易懂的方式將其從DATE
轉換爲timestamptz
?
我正在尋找像(假想的,將無法正常工作)
'2012-01-01'::date AS TIMESTAMPTZ IN TIME ZONE '00:00';
或
to_timestamp('2012-01-01'::date, '00:00'::time, 'UTC');
請指出我錯過了愚蠢明顯的事情。
請注意,我正在測試以確保內部日期真正正確,而不僅僅是在顯示屏上,其中其中$1
是轉換日期。
我試圖避免'TIMESTAMP'類型,因爲它的奇怪而且往往是醜陋的行爲,但如果這是做好這項工作的最好方法。謝謝。 –
通過將'時間戳'加入'AT TIME ZONE'UTC'',您可以立即將醜小鴨變成'timestamptz',永遠不必面對醜陋。 :) –
是的,我想是的。我只是很驚訝,似乎有必要使用'timestamp'來執行'timestamptz'這樣的操作。它會讓'timestamptz'感覺不足或不完整。在這個過程中,我注意到文檔似乎沒有提到將'date'轉換爲'timestamptz'是否會產生本地時間或utc(可能有意義),所以我必須爲此提出一個文檔補丁。 –