Postgresql

將 Postgres TIMESTAMP 轉換為 TIMESTAMPTZ

  • June 20, 2020

我有一個在 Postgres 上執行的大小適中(約 50k 行)的時間序列數據庫,還有一些其他的結構化數據(在另一個數據庫實例中)要小得多。

愚蠢的是,當我最初設計這個東西時,我的所有欄位都是TIMESTAMP WITHOUT TIME ZONE. 我希望一切都是明確的,所以想將該欄位轉換為TIMESTAMP WITH TIME ZONE. 我意識到這不會儲存額外的資訊,而且我所有的時間戳都已經在 UTC,所以遷移應該是微不足道的,但我想知道是否有任何事情複雜化/潛在的絆腳石會證明有問題(這是一個生產客戶依賴它的數據庫)?

請注意在轉換期間應用了正確的時區(在您的情況下為 UTC)。如果您對此不明確,則假定目前會話的時區 - 通常不是UTC。

ALTER TABLE tbl ALTER ts_column TYPE timestamptz USING ts_column AT TIME ZONE 'UTC';

檢查可能的列預設值是否合理。timestamp任何使用數據類型(如LOCALTIMESTAMPor )的表達式now()::timestamp都會遇到同樣的問題。改變:

ALTER TABLE tbl ALTER ts_column SET DEFAULT now();  -- or current_timestamp

顯然,寫入表的語句timestamptz現在也需要使用 - 或者您有另一個相同問題的實例,從 type 自動轉換timestamp [without time zone]

由於這是一個生產數據庫,最好在單個事務中完成所有操作以避免競爭條件 - 甚至是單個語句:

ALTER TABLE tbl
 ALTER ts_column TYPE timestamptz USING ts_column AT TIME ZONE 'UTC'
, ALTER ts_column SET DEFAULT now();

基本:

引用自:https://dba.stackexchange.com/questions/134385