それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

SQLITEの日付の取扱い

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

タイムゾーンは、SQLITEを動かすライブラリが起動してるソフトウェアから取ってくるっぽい。