データベースのタイムゾーン — PostgreSQL、MySQL、MongoDB
PostgreSQL、MySQL、MongoDBでタイムゾーン対応のタイムスタンプを正しく保存・クエリする方法。TIMESTAMPTZ、DATETIME、ISODate型を解説します。
Development
詳細な説明
データベースでのタイムゾーン処理
データベースによってタイムゾーンの扱い方は根本的に異なります。これらの違いを理解することはデータの整合性にとって重要です。
PostgreSQL — ゴールドスタンダード
PostgreSQLは主要データベースの中で最も優れたタイムゾーンサポートを持っています。
TIMESTAMPTZ(推奨):
内部的にUTCとして保存し、入出力時に変換します。
TIMESTAMP(タイムゾーンなし):
リテラル値を保存 — 変換なし、タイムゾーン情報なし。タイムゾーンに関係なく変わるべきでない「壁時計時間」にのみ使用します。
MySQL
MySQLのタイムゾーン処理はそれほど洗練されていません。TIMESTAMP型は2038-01-19 03:14:07 UTCまでの日付のみサポートします。将来の日付には、明示的なUTC処理付きのDATETIMEを使用してください。
MongoDB
MongoDBは日付をエポックからのUTCミリ秒として保存します。表示用にタイムゾーンIDを別途保存する必要があります。
すべてのデータベースでのベストプラクティス
- 保存には常にUTCを使用
- ローカル時間で表示する必要がある場合、IANAタイムゾーンIDを別のカラムに保存
- サーバーと接続のタイムゾーンをUTCに設定
- 暗黙のタイムゾーン変換に依存しない — すべてのクエリで明示的に
ユースケース
タイムスタンプ付きデータを保存するすべてのアプリケーションは、正しいデータベースタイムゾーン処理が必要です。これにはイベントスケジューリングシステム、監査ログ、金融取引記録、時系列データの分析プラットフォーム、マルチタイムゾーンアプリケーションが含まれます。不正なデータベースタイムゾーン設定は、データをサイレントに破損するため、診断が最も困難なバグの一つです。