SQLiteを学んでいこうという連載の7回目です。前回の記事はこちらになります。
前回は、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(協定世界時)ということに気を付けましょう。 次回は日時データの書式についてです。お楽しみに!!