日時の扱い方(SQLiteを学ぶ_7)

SQLiteを学んでいこうという連載の7回目です。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、SQLite内でのデータの挙動について調べてみました。SQLiteは動的なデータ型付けを採用しているので状況によって変換されてしまうことがあります。また、列のデータ型を設定していても、色々な方のデータを登録できてしまいます。注意が必要ですね。

今回は日時の扱い方です。SQLiteには日時を扱うデータ型がありません。どうやって日付や時間を処理ているのでしょうか?

SQLiteにおける日時の扱い方

SQLiteでは日付や時間を文字データで扱います。日付の書式は「YYYY-MM-DD」、時間の書式は「HH:MM:SS」、日付時刻の書式は「YYYY-MM-DD HH:MM:SS」で表します。また、もう1つ気を付けなければならないのは適用されている時間がUTC協定世界時という点です。UTCとは世界各国標準時の基礎となる時間で、我々が普段使用しているJST(日本時間)は協定世界時より9時間進んでいます。

SQLiteは日付や時間の文字データを扱うために、date()、time()、datetime()、julianday()、unixepoch()、strftime()の関数があります。今回はこのうち、date()、time()、datetime()についてご紹介します。

date()

date() 関数は、引数に指定された内容から日付をテキストとして「YYYY-MM-DD」の形式で返します。

sqlite> SELECT date('2023-01-10 08:45:58');
2023-01-10

time()

time() 関数は、引数に指定された内容から時刻をテキストとして「HH:MM:SS」の形式で返します。

sqlite> SELECT time('2023-01-10 08:45:58');
08:45:58

datetime()

datetime() 関数は、引数に指定された内容から日時をテキストとして「YYYY-MM-DD HH:MM:SS」の形式で返します。

sqlite> SELECT datetime('2023-01-10');
2023-01-10 00:00:00

現在の日時を指定する

SQLiteで現在の日付、時間を取得したい場合は、引数に以下を指定することで実現可能です。

  • CURRENT_DATE

    現在の日付を取得します。

sqlite> SELECT datetime(CURRENT_DATE);
2023-01-10 00:00:00
  • CURRENT_TIME

    現在の時刻を取得します

sqlite> SELECT datetime(CURRENT_TIME);
2000-01-01 06:08:47
  • CURRENT_TIMESTAMP

    現在の日時を取得します。

sqlite> SELECT datetime(CURRENT_TIMESTAMP);
2023-01-10 09:28:12

また、「'now'」と指定しても現在の日時を取得できます。

前後の日時を指定する

SQLiteで特定の日時から日時を加算、減算した結果を取得できます。記述方法は以下の様なります。以下の例では1年後の日時を取得しています。

sqlite> SELECT datetime(CURRENT_DATE);
2023-01-11 00:00:00
sqlite> SELECT datetime(CURRENT_DATE, '+1 years');
2024-01-11 00:00:00

「+1 years」の部分を「-1 years」とすると、1年前の日時となります。また、数値の部分は小数点以下の指定も可能です。

sqlite> SELECT datetime(CURRENT_DATE, '-1 years');
2022-01-11 00:00:00
sqlite> SELECT datetime(CURRENT_DATE, '+0.5 years');
2023-07-12 12:00:00

「years」の部分を以下の様に書き換えることで、加算、減算する単位を変更できます。

記述内容 機能
days 日数を指定します
hours 時間数を指定します
minutes 分数を指定します
seconds 秒数を指定します
months 月数を指定します

先頭の日時を指定する

SQLiteで特定の年、月の始まりの日時を取得できます。記述方法は以下の様なります。以下は年の始まりの日時を取得しています。

sqlite> SELECT datetime('2023-02-11 05:53:47','start of year');
2023-01-01 00:00:00

月の始まりの日時は以下の通り

sqlite> SELECT datetime('2023-02-11 05:53:47','start of month');
2023-02-01 00:00:00

時間の始まりは以下になります

sqlite> SELECT datetime('2023-02-11 05:53:47','start of day');
2023-02-11 00:00:00

ちなみに以下の様に指定すると、その年の最終日が取得できます。

sqlite> SELECT datetime('2023-02-11 05:53:47','start of year','+1 years','-1 days');
2023-12-31 00:00:00

皆さんもいろいろ工夫してみてください。

次回は日時の書式

いかがでしたか?SQLiteでの日時の扱い方がわかってきました。繰り返しますが適用されている時間がUTC協定世界時ということに気を付けましょう。 次回は日時データの書式についてです。お楽しみに!!

hirocom777.hatenadiary.org

SQLite学習記事のまとめですはこちらから