JSON日付文字列をSQL DATE・TIMESTAMP値に変換する

ISO 8601日付文字列やUnixタイムスタンプをJSONからSQL DATE、TIMESTAMP、DATETIME カラムに各データベース方言に適したフォーマットで変換する方法を学びます。

Data Types

詳細な説明

JSON日付からSQL時間型へ

JSONにはネイティブの日付型がないため、日付は文字列(通常ISO 8601)またはUnixタイムスタンプ(整数)としてエンコードされます。SQLへの変換には、ターゲットカラムの型とデータベース方言の理解が必要です。

JSONの例

{
  "id": 1,
  "event": "deployment",
  "created_at": "2024-06-15T09:30:00Z",
  "scheduled_for": "2024-07-01",
  "updated_at": 1718444400
}

PostgreSQL出力

INSERT INTO events (id, event, created_at, scheduled_for, updated_at) VALUES
  (1, 'deployment', '2024-06-15T09:30:00Z'::TIMESTAMPTZ,
   '2024-07-01'::DATE,
   TO_TIMESTAMP(1718444400));

MySQL出力

INSERT INTO events (id, event, created_at, scheduled_for, updated_at) VALUES
  (1, 'deployment', '2024-06-15 09:30:00',
   '2024-07-01',
   FROM_UNIXTIME(1718444400));

日付フォーマットマッピング

JSONフォーマット SQL型
"2024-06-15T09:30:00Z" TIMESTAMP / TIMESTAMPTZ タイムゾーン付きISO 8601
"2024-06-15" DATE 日付のみ
"09:30:00" TIME 時間のみ
1718444400 TIMESTAMP(変換経由) Unixエポック秒
1718444400000 TIMESTAMP(変換経由) Unixエポックミリ秒

タイムゾーン処理

ISO 8601文字列にはタイムゾーンオフセットが含まれる場合があります:

  • "2024-06-15T09:30:00Z" -- UTC
  • "2024-06-15T09:30:00+05:30" -- ISTオフセット
  • "2024-06-15T09:30:00" -- タイムゾーンなし(曖昧)

PostgreSQLのTIMESTAMPTZはUTCで保存し、取得時に変換します。MySQLのDATETIMEはタイムゾーン情報を保存しないため、コンバーターは挿入前にUTCに正規化する必要があります。

Unixタイムスタンプの検出

コンバーターは、数値が合理的なエポック範囲(秒の場合は1000000000〜9999999999、ミリ秒の場合は10^12〜10^15)に収まるかチェックすることで、Unixタイムスタンプを自動検出できます。

ベストプラクティス

データベースでは常にUTCで日付を保存し、アプリケーション層でローカル時間に変換してください。これにより曖昧さが回避され、タイムゾーンをまたぐクエリの信頼性が向上します。

ユースケース

JSONベースのログサービス(CloudWatch、Datadog、カスタムAPIなど)からイベントログ、監査証跡、分析データをSQLデータウェアハウスにインポートする際、日付を正しくパースしフォーマットする必要があります。不正確な日付処理はタイムゾーンバグや時系列クエリの破損につながります。

試してみる — JSON to SQL

フルツールを開く