mysqlバージョンによりdate型とdatetime型との比較判定が異なる
WEBサイトを構築していると、ホスティングサーバを移転したりPHPやMYSQLのバージョンを上げることがあります。このときはPHPやMYSQLの仕様違いに気をつけなければなりません。移転したらいきなり動作が異なったりエラーになることがあります。
今回はMYSQLで 日付型(date)と日付時刻型(datetime)を比較したときの判定基準の違いです。
where A = B
date型には時間関連の部分がないので年月日だけで比較されます。
つまり where A(2009-05-01) = B(2009-05-01) なので 条件一致と判断されます。
where A = B
date型には時間関連の部分がないので「00:00:00」として扱われます
つまり where A(2009-05-01 00:00:00) = B(2009-05-01 12:00:00)なので 条件不一致と判断されます。
この仕様の違いについては、mysql5.0リファレンスマニュアル に書かれています。
Prior to MySQL 5.0.42, when DATE values are compared with DATETIME values, the time portion of the DATETIME value is ignored, or the comparison could be performed as a string compare. Starting from MySQL 5.0.42, a DATE value is coerced to the DATETIME type by adding the time portion as '00:00:00'
MySQL 5.0.42前は、DATE型とDATETIME型を比較したとき、DATETIME型の時間部分を無視するか、文字列の比較として処理されてました。
MySQL 5.0.42以降は,DATE型は「00:00:00」を追加され強制的にDATETIME型にされます。
5.0.42前にもいくつもバージョンがありますから、時間が無視されたり文字列比較されたりといろいろ違うようです。5.0.42でDATETIME型に強制的に統一されているようですが、これからのバージョンでどのように仕様変更するかわかりません。
もともと型違いで比較することが間違いですから、トラブルを起こさない為にも型を統一させて比較するようにした方がいいですね。リファレンスマニュアルでもキャストしてと統一するように書いてました。

