SQLiteでのDateTimeの扱い方
SQLiteには直接DateTimeに対応する型がなく、一般的に以下の方法で保存します。
- TEXT型 - ISO8601形式の文字列として保存(例:
2021-04-05T14:30:00.000Z
) - INTEGER型 - UNIXタイムスタンプ(1970年1月1日からの経過秒数またはミリ秒数)として保存
- REAL型 - Julianデイナンバーとして保存
最も柔軟で一般的なのはTEXT型またはINTEGER型です。
ISO8601形式の文字列
CREATE TABLE users (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
birth_day TEXT NOT NULL, -- ISO8601形式の文字列
created_at TEXT NOT NULL -- ISO8601形式の文字列
);
UNIXタイムスタンプを使用する場合
CREATE TABLE pets (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
birth_day INTEGER NOT NULL, -- UNIXタイムスタンプ(ミリ秒)
created_at INTEGER NOT NULL -- UNIXタイムスタンプ(ミリ秒)
);
datetime_converterの実装
// date_time_converter.dart
import 'package:json_annotation/json_annotation.dart';
class DateTimeConverter implements JsonConverter<DateTime, String> {
const DateTimeConverter();
@override
DateTime fromJson(String json) => DateTime.parse(json);
@override
String toJson(DateTime object) => object.toIso8601String();
}
DateTimeの保存方法としては、可読性が高く、タイムゾーン情報も保持できるTEXT型(ISO8601形式)が良さそう。ただ、クエリやソートが頻繁に必要な場合は、INTEGER型(UNIXタイムスタンプ)の方が効率的かもしれませんが、変換作業が増えそうですね。