[sqlite] SQLiteでの日付型の扱い その2

2017年8月21日月曜日

sqlite

前回はSQLiteでの日付の表し方だったけど、今度は日付を用いた計算をしてみよう。

日付の足し引き

1年以上前のデータを削除するような場面では現在から1年前の日付が必要になる。
sqlite> select date('now', 'localtime');
2017-07-09
sqlite> select date('now', 'localtime', '-1 year');
2016-07-09

オプション引数は何個でもつけることができるので、3ヶ月先の月の末日を求めたい場合は以下のようになる。
sqlite> select date('now', 'localtime', '+4 months', 'start of month', '-1 day');
2017-10-31

残念ながら、'end of month'はないので、4ヶ月先の月の最初の日を求めて、1日引くことになる。

日付間の日数

日付間の日数を算出したい場合はどうだろうか。
sqlite> select date('2017-08-01') - date('2017-05-20');
0

単純に文字列形式で差を取ってもダメなので、一旦ユリウス通日かUnix時間に変換して、差を取るようにする。
sqlite> select julianday('2017-08-01') - julianday('2017-05-20');
73.0
sqlite> select cast(julianday('2017-08-01') - julianday('2017-05-20') as integer);
73

秒数差を取りたいのであれば、Unix時間の方が便利。
sqlite> select strftime('%s', '2017-08-01 12:38:21') - strftime('%s', '2017-07-30 09:08:56');
185365

SQL As Understood By SQLite Date And Time Functions