簡體   English   中英

如何在 postgresql 中使用時區更新日期?

[英]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

這里有什么問題?

tl;博士

沒有錯。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM