導入:なぜ日付・時刻操作が重要なのか
データベース運用において、日時の扱いは避けて通れない要素です。「本日のデータを抽出する」「ログの経過時間を計算する」「特定の期間のレコードを絞り込む」といった業務は日常茶飯事です。しかし、SQLiteは標準で専用の「日時型」を持たず、文字列や数値として日時を管理するため、関数による適切な変換と計算の知識が不可欠です。本記事では、SQLiteにおける日付・時刻関数の基本から、現場で即戦力となる活用術を解説します。
基礎知識:SQLiteの日時管理
SQLiteでは、主に文字列(’YYYY-MM-DD HH:MM:SS’など)やユリウス日(数値)を使用して日時を表現します。重要な点は、標準の挙動としてタイムゾーンがUTC(協定世界時)として扱われることです。日本(JST)のシステムで利用する場合は、必要に応じて「localtime」修飾子を使い、時差を考慮する必要があります。
実装:主要関数と修飾子の活用
以下の5つの関数が日時操作の核となります。
・date(): 日付(YYYY-MM-DD)を取得
・time(): 時刻(HH:MM:SS)を取得
・datetime(): 日時(YYYY-MM-DD HH:MM:SS)を取得
・julianday(): 通算日(数値)を取得
・strftime(): 指定フォーマットで取得
これらに「修飾子(Modifier)」を組み合わせることで、柔軟な日時計算が可能です。
サンプルプログラム:実務で使えるクエリ集
以下のコードは、現場で頻出するパターンをまとめたものです。そのままコピーしてDBクライアント等で実行可能です。
— 1. 現在の日本標準時(JST)を取得する
SELECT datetime(‘now’, ‘localtime’) AS current_jst;
— 2. 3日前の日付を取得する
SELECT date(‘now’, ‘-3 days’) AS three_days_ago;
— 3. 今月の1日の0時0分0秒を取得する(締め処理などで多用)
SELECT datetime(‘now’, ‘start of month’) AS start_of_month;
— 4. 次の月曜日を取得する(曜日指定)
— 0:日, 1:月, …, 6:土
SELECT date(‘now’, ‘weekday 1’) AS next_monday;
— 5. ミリ秒まで含めた詳細なタイムスタンプを取得する
SELECT strftime(‘%Y-%m-%d %H:%M:%f’, ‘now’, ‘localtime’) AS precise_time;
応用・注意点:現場でのバグ回避
1. タイムゾーンの罠:
`now`は常にUTCです。日本国内向けのサービスで「本日のデータ」を取得する際、UTCのまま判定すると、日本時間の午前9時まで「前日」として扱われてしまいます。必ず`’now’, ‘localtime’`をセットで使用する癖をつけましょう。
2. データ型の整合性:
SQLiteは柔軟ですが、日付を検索条件にする際は、カラムに格納されている形式と関数の出力形式を合わせることが肝要です。文字列比較が正しく行われるよう、可能な限りISO8601形式(YYYY-MM-DDなど)で保存することを推奨します。
3. パフォーマンスへの配慮:
大規模なテーブルでWHERE句に`strftime`などの関数を使用すると、インデックスが効かずスキャンが発生し、パフォーマンスが著しく低下します。日時検索を行う場合は、関数を通さず比較できるよう、あらかじめインデックス付きのカラムに加工済みの値を保存しておく設計が重要です。

コメント