SQLiteで日付を扱うときに注意すること
SQLiteにはデータ型がないので、日付を扱うときには注意が要ります。
たとえば、
id | date |
---|---|
1 | 2008-01-1 00:00:00 |
2 | 2008-01-4 00:00:00 |
3 | 2008-01-08 00:00:00 |
4 | 2008-01-10 00:00:00 |
5 | 2008-01-21 00:00:00 |
というデータがあるときにdateでソートすると、
id | date |
---|---|
3 | 2008-01-08 00:00:00 |
1 | 2008-01-1 00:00:00 |
4 | 2008-01-10 00:00:00 |
5 | 2008-01-21 00:00:00 |
2 | 2008-01-4 00:00:00 |
という順番になります。
これは、dateの値が文字列として扱われているからです。
不等号による比較やBETWEENを実行するときにも影響してくるので、挿入前に適切な形にフォーマットを行う必要があります。
MySQLの場合は「2008-1-1 0:0:0」という形式で入れても「2008-01-01 00:00:00」と扱われるので、同じ感覚でSQLiteを使っていると痛い目を見ます。
こういった問題がわずらわしい場合は、julianday関数を使って浮動小数点数に変換して日付を保存する方法もあります。
参考:SQLite の日付関係処理
あるいは、SQLを使うプログラム側でエポック秒に変換する方法もあります。
あと、SQLiteで現在の時刻を取得する場合
select datetime('now');
と実行するのですが、現在の時刻からマイナス9時間された値が返ってきます。
ロケールがうまくあっていないようなので、これを使って時刻を表示する場合は、以下のように実行して、9時間プラスします。
select datetime('now' ,'+09:00:00');