[英]How to update a date with a time zone in postgresql?
我想用時區(+2 小時)更新日期,但它最終為 UTC(0 小時)
日期類型是 'timestamp-with-timezone'
詢問...
update table set date = '2022-05-25 13:28+02:00'
將在數據庫中結束。
2022-05-25 11:28:00+00
這里有什么問題?
沒有錯。 Postgres 以 UTC 存儲TIMESTAMP WITH TIME ZONE
的值,始終與 UTC 的偏移量為零。 任何提交的偏移量或區域都用於調整到 UTC。
日期類型是 'timestamp-with-timezone'
標准 SQL 和 Postgres 中都沒有這種類型。
我假設您的意思是TIMESTAMP WITH TIME ZONE
。
它以 UTC 結尾(0 小時)
閱讀精美的手冊。 您正在看到記錄在案的行為。
Postgres 總是將值存儲在 UTC 中的TIMESTAMP WITH TIME ZONE
類型的列中,也就是說,偏移量為零小時-分鍾-秒。
輸入提供的任何時區或偏移量都用於調整為 UTC。 然后丟棄提供的區域或偏移量。
所以TIMESTAMP WITH TIME ZONE
類型的名稱是用詞不當。 首先,SQL 的作者考慮的是偏移量,而不是實時時區。 其次,不存儲任何提交的時區。 提交的區域用於調整然后丟棄。
如果您需要跟蹤原始偏移量或區域,請添加額外的列。 您必須添加代碼來存儲偏移量或時區名稱。
update table set date = '2022-05-25 13:28+02:00'
將在數據庫中結束。2022-05-25 11:28:00+00
這里怎么了?
沒有什么是錯的。 這是一個特性,而不是一個錯誤。 這兩個字符串都代表相同的同時時刻。
僅供參考,數據庫引擎在處理日期時間類型和行為的行為方面差異很大。
有些人像 Postgres 對TIMESTAMP WITH TIME ZONE
所做的那樣,調整為 UTC,然后丟棄任何提供的時區或偏移量。 其他一些可能不會。
SQL 標准幾乎沒有涉及日期時間處理的主題。 它聲明了幾種類型,並且在所有情況下都覆蓋不完整的情況下做得很差。 該標准忽略了定義行為。
因此,在數據庫工作中處理日期時間時要非常小心。 仔細閱讀特定數據庫引擎的文檔。 不要做假設。 運行實驗以驗證您的理解。 並且知道為日期時間編寫可移植的 SQL 代碼可能不可行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.