hkoba blog

プログラマーです。プログラミング言語ミーハーです。ツッコミ歓迎です。よろしくどうぞ(能代口調)

備忘録:SQLite で timestamp と iso8601 を相互変換する定型句

忘れがちなので。ツッコミ歓迎です。 より詳しくはSQLite のマニュアル

timestamp(unixepoch) から iso8601 へ(現地時間で)

-- ts に timestamp が入っているとして。
select datetime(ts, 'unixepoch', 'localtime');

select datetime(0, 'unixepoch', 'localtime'); -- ex. 1970-01-01 09:00:00

-- datetime と等価な strftime
select strftime('%Y-%m-%d %H:%M:%S', ts, 'unixepoch', 'localtime');

utc で良い時は 'localtime' は省略できる

iso8601 から timestamp へ

-- timezone まで書いてあった場合
select strftime('%s', '1970-01-01 09:00:00 +09:00'); -- 0

-- timezone 書いてない時に、utc に戻すには
select strftime('%s', '1970-01-01 09:00:00', 'utc'); -- 0

roundtrip

% sqlite3 :memory: "select
 datetime(strftime('%s', '2015-07-31 16:11:02', 'utc')
          , 'unixepoch', 'localtime')"
2015-07-31 16:11:02
% 

オマケ。現在時刻の扱い。

-- iso8601 で. (timezone 抜き)
select datetime('now');

-- timestamp として
select strftime('%s', 'now');