SQLiteのTIMESTAMP型のフィールド値をSQLiteのdatetime関数で日本時間に変換

SQLiteでtablesテーブルに、ctimeていうTIMESTAMP型フィールドがあって、当然自動で時刻が入っているわけだけれども、SQLite側で日本時間に変換できるそうだ。

昨日のエントリの下部に表示されていたリファ参照して、


>>2008-02-19 SQLiteのTIMESTAMP型のフィールド値をPerlのDateTimeモジュールで日本時間に変換 - CLの日記
ごたく:SQLite側でやるなら、sqlite - Date And Time Functions の datetime(?, ?, 'localtime') だったかしらん。

ということでやってみました。

SELECT ctime, datetime(ctime, 'localtime') AS ctime_localtime FROM tables;

$ sqlite3 hoge.db 
SQLite version 3.3.6
Enter ".help" for instructions
sqlite> SELECT ctime, datetime(ctime, 'localtime') AS ctime_localtime FROM tables;
2008-02-15 02:02:05|2008-02-15 11:02:05
2008-02-15 02:42:02|2008-02-15 11:42:02
2008-02-15 02:49:10|2008-02-15 11:49:10
2008-02-15 02:49:53|2008-02-15 11:49:53
2008-02-18 04:59:18|2008-02-18 13:59:18
2008-02-18 05:07:17|2008-02-18 14:07:17
2008-02-18 05:10:15|2008-02-18 14:10:15
2008-02-18 05:10:26|2008-02-18 14:10:26
2008-02-18 05:11:14|2008-02-18 14:11:14
2008-02-18 05:11:23|2008-02-18 14:11:23
2008-02-18 05:11:33|2008-02-18 14:11:33
2008-02-18 05:38:24|2008-02-18 14:38:24
2008-02-18 07:26:50|2008-02-18 16:26:50
2008-02-18 08:09:35|2008-02-18 17:09:35
2008-02-19 06:31:30|2008-02-19 15:31:30
2008-02-19 06:39:50|2008-02-19 15:39:50
2008-02-19 06:40:30|2008-02-19 15:40:30
2008-02-19 06:43:31|2008-02-19 15:43:31
2008-02-19 06:50:53|2008-02-19 15:50:53
2008-02-19 08:19:17|2008-02-19 17:19:17
sqlite> .q
$

こんな感じで出てきますー

これをPerlのDateTimeモジュールで取り扱う場合は、タイムゾーン指定が一回で済みますね。以下参照。

use DateTime::Format::MySQL;
my $timestamp = '2008-02-19 12:00:00'; #JST
my $dt = DateTime::Format::MySQL
           ->parse_datetime( $timestamp )
           ->set_time_zone('local');
print $dt->strftime('%m/%d %H:%M');

02/19 12:00

むしろタイムゾーン指定なしでも取り扱えちゃうかも!

use DateTime::Format::MySQL;
my $timestamp = '2008-02-19 12:00:00'; #JST
my $dt = DateTime::Format::MySQL
           ->parse_datetime( $timestamp );
print $dt->strftime('%m/%d %H:%M');

02/19 12:00

スマート、スマート!