SQLite の日付の取扱について
sqlite は単なるファイル。単なるファイルなので、アクセスする側に組み込まれた「ライブラリ」が日付やローカライズを処理する。
また、ほぼすべてのエントリがテキストで書かれているので、時間処理は基本的に関数計算を経由することになる。
日付の計算
日付の計算は、datetime 関数を通して行う。
datetime( カラム名など, フォーマット, [フォーマット...] )
日付の計算は文字列でやるのが結構楽でいい。
たとえば10日後
>> select current_timestamp; current_timestamp ------------------- 2015-11-24 10:17:37 >> select datetime(current_timestamp, "+10 days"); datetime(current_timestamp, "+10 days") --------------------------------------- 2015-12-04 10:17:57
ちなみに時刻はすべてUTCで返すので注意が必要。
よくある間違い。
sqlite で日付が計算されない時は、スペースの付け方がおかしい。
うまくいかない例
>> select datetime(current_timestamp, "+10days"); datetime(current_timestamp, "+10days") -------------------------------------- >> select datetime(current_timestamp, "+ 10days"); datetime(current_timestamp, "+ 10days") --------------------------------------- >> select datetime(current_timestamp, "+ 10 days"); datetime(current_timestamp, "+ 10 days") ----------------------------------------
かさねがねしちゃう
datetime を 次のように記述するのは無駄。
select datetime(datetime(login_At, "+1 hours"), "+1 days"):
なので、重ねがけ指定をする。
>> select id, login_at, datetime( login_at , "+1 hours", "+1 days") as expire from users ; id login_at expire ---------- ------------------------- ------------------- 1 2015-11-20T05:39:34+09:00 2015-11-20 21:39:34 2 2015-11-20T06:17:31+09:00 2015-11-20 22:17:31 3 2015-11-20T20:28:52+09:00 2015-11-21 12:28:52 4 2015-11-20T20:30:18+09:00 2015-11-21 12:30:18
UTCとタイムゾーンの変換も手動でやるよ。
>> select id, login_at, datetime( login_at , "utc") , datetime(login_at, "localtime") as expire from users ; id login_at datetime( login_at , "utc") expire ---------- ------------------------- --------------------------- ------------------- 1 2015-11-20T05:39:34+09:00 2015-11-19 11:39:34 2015-11-20 05:39:34 2 2015-11-20T06:17:31+09:00 2015-11-19 12:17:31 2015-11-20 06:17:31 3 2015-11-20T20:28:52+09:00 2015-11-20 02:28:52 2015-11-20 20:28:52 4 2015-11-20T20:30:18+09:00 2015-11-20 02:30:18 2015-11-20 20:30:18