Site cover image
日々記録

SQLiteで日付を扱う場合(メモ)

SQLiteでのDateTimeの扱い方

SQLiteには直接DateTimeに対応する型がなく、一般的に以下の方法で保存します。

  1. TEXT型 - ISO8601形式の文字列として保存(例:2021-04-05T14:30:00.000Z
  2. INTEGER型 - UNIXタイムスタンプ(1970年1月1日からの経過秒数またはミリ秒数)として保存
  3. 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タイムスタンプ)の方が効率的かもしれませんが、変換作業が増えそうですね。