JSON日付文字列をSQL DATEおよびTIMESTAMPカラムに変換する
JSON ISO 8601日付文字列がSQL DATE、TIMESTAMP、DATETIMEカラム型にどのようにマッピングされるかを学びます。タイムゾーン処理と精度オプションを解説。
Column Types
詳細な説明
日付とタイムスタンプのマッピング
JSONにはネイティブの日付型がなく、日付は通常ISO 8601形式の文字列としてエンコードされます。コンバーターは日付らしき文字列を検出し、適切なSQL時間型にマッピングします。
JSON例
{
"id": 1,
"title": "Project Alpha",
"start_date": "2024-06-15",
"created_at": "2024-06-15T10:30:00Z",
"updated_at": "2024-06-15T10:30:00.123456Z",
"deadline": "2024-12-31T23:59:59+09:00"
}
生成されるSQL
CREATE TABLE projects (
id INTEGER NOT NULL,
title VARCHAR(255) NOT NULL,
start_date DATE NOT NULL,
created_at TIMESTAMP WITH TIME ZONE NOT NULL,
updated_at TIMESTAMP(6) WITH TIME ZONE NOT NULL,
deadline TIMESTAMP WITH TIME ZONE NOT NULL
);
検出ヒューリスティック
コンバーターは以下の方法で日付文字列を識別します:
- ISO 8601パターン —
YYYY-MM-DD、YYYY-MM-DDTHH:mm:ssZなど。 - カラム名のヒント —
_at、_date、_time、created、updated、deleted、expiresを含む名前。 - Unixタイムスタンプ —
timestamp、created_atなどの名前を持つカラムの大きな整数(>1,000,000,000)。
SQL型の選択
| パターン | SQL型 |
|---|---|
2024-06-15(日付のみ) |
DATE |
2024-06-15T10:30:00(tzなし) |
TIMESTAMP / DATETIME |
2024-06-15T10:30:00Z(tzあり) |
TIMESTAMP WITH TIME ZONE |
| 小数秒 | マイクロ秒精度のTIMESTAMP(6) |
タイムゾーンのベストプラクティス
常にタイムゾーン情報付きでタイムスタンプを保存してください。 TIMESTAMP WITH TIME ZONE(PostgreSQLのTIMESTAMPTZ)を使用すると、保存時にUTCに正規化され、取得時にセッションのタイムゾーンに変換されます。タイムゾーンなしで保存すると、アプリケーションが複数のリージョンにまたがる場合に曖昧さが生じます。
自動生成タイムスタンプ
created_atとupdated_atカラムに対して、コンバーターは以下を追加します:
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
行の変更ごとにupdated_atを更新するトリガーまたはアプリケーションレベルのロジックも追加すべきです。
データベースの違い
- PostgreSQL:
TIMESTAMPTZはTIMESTAMP WITH TIME ZONEのエイリアスです。 - MySQL:
DATETIMEはタイムゾーンなしで値を保存します。TIMESTAMPはUTCに変換しますが、範囲が制限されています(2038年まで)。 - SQL Server:
DATETIMEOFFSETはタイムゾーンオフセットを明示的に保存します。
ユースケース
さまざまなタイムゾーン形式が混在するISO 8601日付を返すスケジューリングAPIからイベントデータをインポートし、各カラムに適切なSQL時間型と適切なタイムゾーン処理を使用する必要がある場合に使用します。