注目★★★★★Lobsters
タイムゾーン変更でPostgresのtimestamptzが1時間ズレる問題と対策
30秒で把握
- 1BC州の通年UTC-7移行でPostgresのtimestamptz保存データが1時間ズレる
- 2tzdata更新前後でデータが混在すると予約時刻の整合性が崩れるリスクがある
- 3将来予約はローカル時刻・TZ名・UTC計算値の3列パターンへの見直しを検討
要約
2026年3月、ブリティッシュコロンビア州が通年サマータイム(UTC-7固定)へ移行したことで、PostgreSQLのtimestamptz列に保存した予約データが1時間ズレる問題が発生する。timestamptz列はUTC値を保存し、クエリ時に現在のタイムゾーンルールで変換するため、tzdata更新前後で保存されたデータが混在すると意図した時刻と異なる値が返る。対策として、ローカル時刻・タイムゾーン名・UTC計算値の3列を持つ「デュアルカラムパターン」を採用し、ユーザーの意図(壁時計時刻)と計算済みUTCを別々に保持することが有効だ。ログイベントや金融取引など過去の確定イベントにはtimestamptzのみで十分で、将来の予約など「ローカル意図」が重要なケースにのみこのパターンを適用する。
あなたへの影響
America/Vancouverを扱うシステムを運用するチームは、SELECT to_char('2026-12-01 10:00:00'::timestamp AT TIME ZONE 'America/Vancouver', 'HH24:MI:SS OF')でtzdataの更新状況を確認し、既存のtimestamptz列に影響が出るか検証すべき。
推奨:将来の予約・スケジュール系テーブルはデュアルカラムパターンへの移行を検討する価値があり得る。