2022年1月8日土曜日

SQLite3で時間の計算をする

概要

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

構文


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

実行例

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

時(hours)の計算

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
                            

分(minutes)の計算

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

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


    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
                        

秒(seconds)とミリ秒(milliseconds)の計算

time()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日」になるので注意すること。

参考URL