web-dev-qa-db-ja.com

PostgresのTIMESTAMPをTIMESTAMPTZに変換する

適切なサイズ(約5万行)の時系列データベースがPostgresで実行されており、他のいくつかの構造化データ(別のデータベースインスタンス内)がはるかに小さい。

愚かなことに、私が最初にすべてのフィールドをTIMESTAMP WITHOUT TIME ZONEとして設計したとき、今はタイムゾーンに関連する厄介なバグでその代金を払っています。すべてを明示的にしたいので、フィールドをTIMESTAMP WITH TIME ZONEに変換します。これには余分な情報が保存されておらず、すべてのタイムスタンプはすでにUTCであるため、移行shouldは簡単ですが、複雑になる可能性や潜在的なトリップブロックがあるかどうか疑問に思っていました問題があると判明しましたか(これは、顧客がそれに依存している本番データベースです)?

8
GTF

変換中に正しいタイムゾーン(この場合はUTC)が適用されることに注意してください。これが明示されていない場合は、現在のセッションのタイムゾーンが想定されます-通常UTCではありません。

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

可能性のある列のデフォルトの健全性も確認してください。データ型timestampLOCALTIMESTAMPnow()::timestampなど)を使用する式はすべて同じ問題の影響を受けます。変更するには:

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

もちろん、テーブルに書き込むステートメントでもtimestamptzを使用する必要があります-または、タイプ_timestamp [without time zone]_からの自動変換に関する同じ問題の別のインスタンスがあります。

これは本番DBであるため、競合状態を回避するために単一のトランザクションで実行するか、単一のステートメントで実行することをお勧めします。

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

基本:

13