MySQLの日付周りを甘く見てたら、ハマった。

column BETWEEN A AND B
イコール
A <=column and column <=B
なので、以下のSQLの結果は同一かと思ったが、違った。。。

mysql> select '2010-07-26 00:00:00' BETWEEN '2010-07-25' AND '2010-07-26';
+-------------------------------------------------------------+
| '2010-07-26 00:00:00' BETWEEN '2010-07-25' AND '2010-07-26' |
+-------------------------------------------------------------+
| 0 |
+-------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select '2010-07-26' BETWEEN '2010-07-25' AND '2010-07-26';
+----------------------------------------------------+
| '2010-07-26' BETWEEN '2010-07-25' AND '2010-07-26' |
+----------------------------------------------------+
| 1 |
+----------------------------------------------------+
1 row in set (0.01 sec)

なぜかというと、ただのクウォートだと文字として比較してしまうから。
比較対象のカラムは型を意識しなければならない。

mysql> SELECT CAST('2010-07-26 00:00:00' AS DATETIME) BETWEEN '2010-07-25' AND '2010-07-26';
+-------------------------------------------------------------------------------+
| CAST('2010-07-26 00:00:00' AS DATETIME) BETWEEN '2010-07-25' AND '2010-07-26' |
+-------------------------------------------------------------------------------+
|                                                                             1 |
+-------------------------------------------------------------------------------+
1 row in set (0.00 sec)

range指定は対象カラムの型に自動変換されるみたい。