読者です 読者をやめる 読者になる 読者になる

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の時間を含めない
  • アプリケーション側で取得したあとでソートするようにする