Postgresql
將 Postgres TIMESTAMP 轉換為 TIMESTAMPTZ
我有一個在 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
任何使用數據類型(如LOCALTIMESTAMP
or )的表達式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();
基本: