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
タイムゾーンでローカライズを行うと次のようになる。
>> 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
タイムゾーンは、SQLITEを動かすライブラリが起動してるソフトウェアから取ってくるっぽい。