1. ホーム
  2. データベース
  3. エスキューエルライト

SQLite3における日付と時刻の関数のまとめ

2022-01-10 19:59:33


コピーコード コードは以下の通りです。

import sqlite3
conn = sqlite3.connect('/tmp/sqlite.db')
cur = conn.cursor()

次は何をする?テーブルを作成します。SQLiteはテーブルの作成中にインデックスを作成することをサポートしていないので、まずテーブルを作成し、次にインデックスを作成するという2つのステップを踏まなければならないことに注意してください
コピーコード コードは以下の通りです。
create_table_stmt = '''CREATE TABLE IF NOT EXISTS test_table (
 id INTEGER PRIMARY KEY AUTOINCREMENT,
 duration INTEGER,
 event_date TEXT,
 parameter TEXT );'''

create_index = 'CREATE INDEX IF NOT EXISTS idx_id ON test_table (id);'
cur.execute(create_table_stmt)
cur.execute(create_index)
conn.commit()

SQLiteは5つの基本的なデータ型のみをサポートしています。

コピーコード コードは以下の通りです。

The value is a NULL value    
INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value
REAL. The value is a floating point value, stored as an 8-byte IEEE floating point number
TEXT. The value is a text string, stored using the database encoding (UTF-8, UTF-16BE or UTF-16LE)
BLOB. The value is a blob of data, stored exactly as it was input

問題は、SQLite の時刻と日付の型はどこにあるのか、ということです。SQLite は以下のデータ型で時刻と日付を保存できることが判明しました。

コピーコード コードは以下の通りです。

TEXT as ISO8601 strings ('YYYY-MM-DD HH:MM:SS.SSS').
REAL as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar.
INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC.

insert_stmt = 'insert into test_table values (? , ? , , ?)'
record = (123, '2011-11-30 12:34:56', 'hello world')
cur.execute( insert_stmt, record )
conn.commit()


日付を文字列として保存した後、それを取り出して日付として使うことはできないので、SQLiteの日付関数を呼び出してから使う必要があります
例えば、前日に保存したデータを検索する場合。
コピーコード コードは以下の通りです。

SELECT
 id,
 duration,
 event_date,
 parameter
 FROM test_table
WHERE
 DATE(event_date) = DATE('now', '-1 day', 'localtime')
ORDER BY id, event_date

テーブル構造を見る select * from sqlite_master
テーブル情報を見る PRAGMA table_info (table_name)

SQLiteの時刻・日付関数

SQLiteには、以下のような時刻・日付関数があります。

コピーコード コードは以下の通りです。

datetime() .......................  Generate date and time
date() ........................... Generate the date
time() ........................... Generate the time
strftime() .......................  Format the date and time generated by the above three functions

datetime()の使い方は、datetime(date/time, modifier, modifier...)となります。
date()、time()の構文は、datetime()と同じです。

time/date関数の引数には、以下の形式の文字列が使用できます。

コピーコード コードは以下の通りです。
YYYY-MM-DD
YYYY-MM-DD HH:MM
YYYY-MM-DD HH:MM:SS
HH:MM
HH:MM:SS
now # where now is the time to generate the present.

例えば(このノートは2006年10月17日20:00から22:00(太平洋標準時)に書かれました)。

コピーコード コードは以下の通りです。

select datetime('now');
Result: 2006-10-17 12:55:54

select datetime('2006-10-17');
Result: 2006-10-17 12:00:00

select datetime('2006-10-17 00:20:00', '+1 hour', '-12 minute');
Result: 2006-10-17 01:08:00

select date('2006-10-17', '+1 day', '+1 year');
Result: 2007-10-18

select datetime('now', 'start of year');
Result: 2006-01-01 00:00:00

select datetime('now', 'start of month');
Result: 2006-10-01 00:00:00

select datetime('now', 'start of day');
Result: 2006-10-17 00:00:00

# Despite adding 10 hours to the 2nd parameter, the time is zeroed to 00:00:00 by the 3rd parameter start of day
# The subsequent 4th argument adds 10 hours to 00:00:00 to make it 10:00:00.
select datetime('now', '+10 hour', 'start of day', '+10 hour');
Result: 2006-10-17 10:00:00

# Convert the Greenwich time zone to the local time zone.
select datetime('now', 'localtime');
Result: 2006-10-17 21:21:47

select datetime('now', '+8 hour');
Result: 2006-10-17 21:24:45


strftime()関数は、YYYY-MM-DD HH:MM:SS 形式の日付文字列を他の形式の文字列に変換します。
strftime()のシンタックスは strftime(format, date/time, modifier, modifier, ...) です。

以下の表記で日付と時刻をフォーマットすることができます。
d月、01-31
f 秒単位の端数処理、SS。
H時、00-23
j 特定の日が1年のうち何日目かを調べる、001-366
m 月、00-12
%M 分、00-59
%s 1970年1月1日から現在までの秒数
S秒、00-59
w 週、0-6 (0は日曜日)
W ある日が属する週(01-53)を検索します。
YY年、YYYY
%% パーセント記号

strftime()の使用例は次のとおりです。

コピーコード コードは以下の通りです。

select strftime('%Y/%m/%d %H:%M:%S', 'now', 'localtime');

結果:2006/10/17 21:41:09