sqliteの違う環境で動作させたときだけ発生する怖いバグ
Time Zone の異なる場所で記録したDateTimeのデータでソートしようとするとソート順が正しくなりません.
例.
sqlite> select id, created_at from entries; 1|2011-01-09T05:39:08+09:00 2|2011-01-09T05:39:08+09:00 3|2011-01-08T15:40:08-05:00 sqlite> select id, created_at from entries order by created_at desc; 1|2011-01-09T05:39:08+09:00 2|2011-01-09T05:39:08+09:00 3|2011-01-08T15:40:08-05:00
2011-01-08T15:40:08-05:00は
2011-01-09T05:39:08+09:00より1分あとのははずですが.ソート結果は逆になっています.
原因
sqliteにはそもそもDate型とかDateTime型といったものがありません.
created_atはただの文字列として定義されてるのでソート結果も頭の文字から
並べ換えていくだけなわけで,Time Zoneは正しく処理できません.
解決法
- 異なるTimeZoneの時間を含めない
- アプリケーション側で取得したあとでソートするようにする