2022年1月8日土曜日

SQLite3で時間の計算をする

概要

SQLiteで時間の計算をするには「time()」、もしくは「datetime()」を使用する。
なお、「time()」の結果は時間部分だけではなく日付部分を持っており、必ず2000年1月1日になる。

構文


time(time-value, modifier, modifier, ...)
datetime(time-value, modifier, modifier, ...)
                    

実行例

環境
  • Windows 10 64bit
  • SQLite3 ver.3.37.0

時の計算

「time()」や「datetime()」の引数に「NNN hours」を追加する。
例えば1時間後を計算したければ「+1 hours」を追加する。

「datetime()」であれば日を跨ぐ計算もしてくれる。

「time()」の場合は日を跨ぐ計算をしても、2000年1月1日の扱いになる。


sqlite> select time('09:00:00', '+1 hours');
10:00:00

sqlite> select time('09:00:00', '-1 hours');
08:00:00

sqlite> select time('23:00:00', '+2 hours');
01:00:00

sqlite> select time('01:00:00', '-2 hours');
23:00:00

sqlite> select datetime('2021-01-01 09:00:00', '+1 hours');
2021-01-01 10:00:00

sqlite> select datetime('2021-01-01 09:00:00', '-1 hours');
2021-01-01 08:00:00

sqlite> select datetime('2021-01-01 23:00:00', '+2 hours');
2021-01-02 01:00:00

sqlite> select datetime('2021-01-01 01:00:00', '-2 hours');
2020-12-31 23:00:00
                    
「time()」の結果は何をしても2000年1月1日になる

sqlite> select datetime(time('23:00:00', '+2 hours'));
2000-01-01 01:00:00

sqlite> select datetime(time('2021-09-01 23:00:00', '+2 hours'));
2000-01-01 01:00:00

sqlite> select datetime(time('2021-09-01 01:00:00', '-2 hours'));
2000-01-01 23:00:00
                        

分の計算

「date()」や「datetime()」の引数に「NNN minutes」を追加する。
例えば1分後を計算したければ「+1 minutes」を追加する。

時を跨ぐ計算もしてくれる。


sqlite> select time('09:05:00', '+1 minutes');
09:06:00

sqlite> select time('09:05:00', '-1 minutes');
09:04:00

sqlite> select time('09:59:00', '+2 minutes');
10:01:00

sqlite> select time('10:01:00', '-2 minutes');
09:59:00

sqlite> select datetime('2021-01-01 09:05:00', '+1 minutes');
2021-01-01 09:06:00

sqlite> select datetime('2021-01-01 09:05:00', '-1 minutes');
2021-01-01 09:04:00
                    

秒、ミリ秒の計算

「date()」や「datetime()」の引数に「NNN.NNNN seconds」を追加する。
例えば1秒後を計算したければ「+1 seconds」を追加する。

分を跨ぐ計算もしてくれる。

なお、ミリ秒は切り捨てられる。


sqlite> select time('09:00:05', '+1 seconds');
09:00:06

sqlite> select time('09:00:05', '-1 seconds');
09:00:04

sqlite> select datetime('09:00:05', '+1 seconds');
2000-01-01 09:00:06

sqlite> select datetime('09:00:05', '-1 seconds');
2000-01-01 09:00:04

sqlite> select time('09:00:59', '+2 seconds');
09:01:01

sqlite> select time('09:00:01', '-2 seconds');
08:59:59

sqlite> select time('09:00:05', '+00.0001 seconds');
09:00:05

sqlite> select time('09:00:05.9999', '+0.0002 seconds');
09:00:05
                    

selectの結果で日付を計算する

上記の通り、時間を計算するには「time()」や「datetime()」の引数に文字列を指定する必要がある。 データベース内のデータで計算する場合、文字列を連結して引数を作ってやればいい。

他のテーブルのデータを利用する場合はテーブルを結合する。

以下は「num」カラムの値を「time」カラムの秒に足す例。

time_list テーブル
str_time
text
int_num
integer
09:01:01 1
09:01:01 2
09:01:01 3

sqlite> select
   ...>     time(
   ...>         str_time
   ...>         , '+' || int_num || ' seconds'
   ...>     )
   ...> from
   ...>     time_list
   ...> ;
09:01:02
09:01:03
09:01:04
                    

時間のフォーマットをdateやdatetimeの引数に指定すると、必ず「2000年1月1日」になるので注意すること。

外部参考サイト