Hatena::ブログ(Diary)

public static void main

誰かが困って検索したときに助けになる話題を書いていければと思っています。

2008-01-08

[]SQLiteで日付を扱うときに注意すること

SQLiteにはデータ型がないので、日付を扱うときには注意が要ります。

たとえば、

iddate
12008-01-1 00:00:00
22008-01-4 00:00:00
32008-01-08 00:00:00
42008-01-10 00:00:00
52008-01-21 00:00:00

というデータがあるときにdateでソートすると、

iddate
32008-01-08 00:00:00
12008-01-1 00:00:00
42008-01-10 00:00:00
52008-01-21 00:00:00
22008-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');

u87u87 2011/02/17 14:33 select datetime('now', 'localtime');
でもいいかと思ったけど

…って三年も前のブログに突っ込むのもアレかな?

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/Kishi/20080108/1199785354