データベースのタイムゾーン — 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を別途保存する必要があります。

すべてのデータベースでのベストプラクティス

  1. 保存には常にUTCを使用
  2. ローカル時間で表示する必要がある場合、IANAタイムゾーンIDを別のカラムに保存
  3. サーバーと接続のタイムゾーンをUTCに設定
  4. 暗黙のタイムゾーン変換に依存しない — すべてのクエリで明示的に

ユースケース

タイムスタンプ付きデータを保存するすべてのアプリケーションは、正しいデータベースタイムゾーン処理が必要です。これにはイベントスケジューリングシステム、監査ログ、金融取引記録、時系列データの分析プラットフォーム、マルチタイムゾーンアプリケーションが含まれます。不正なデータベースタイムゾーン設定は、データをサイレントに破損するため、診断が最も困難なバグの一つです。

Try It — Timezone Reference

フルツールを開く