今までのMySQLでは、
mysql> SELECT CAST( DATE(SYSDATE()) AS DATETIME ) = CAST( DATE(SYSDATE()) AS DATE )結果は真だが、MySQL 5.5.10 では、
AS datecomp;
+----------+
| datecomp |
+----------+
| 1 |
+----------+
mysql> SELECT CAST( DATE(SYSDATE()) AS DATETIME ) = CAST( DATE(SYSDATE()) AS DATE )同じSQL文でも結果は偽である。
AS datecomp;
+----------+
| datecomp |
+----------+
| 0 |
+----------+
これは、DATE型とDATETIME型を比較するときの暗黙の型変換に仕様変更があったということか。
以前のMySQLでは、DATE型と、同日の'00:00:00'の時刻を持つDATETIME型は同じ値だった(DATE型がDATETIME型に暗黙に変換される時、'00:00:00'を加えられていた)が、5.5.xでは、違う値として処理される。
次のようなSQLを実行してみると、
5.5.10となるので、DATE型がDATETIME型に暗黙に変換される場合、'00:00:00' より小さい時刻の値で埋められるように変更されたのではないだろうか(ドキュメントは軽くしか読んでないけどどっかに書いてあるかも)。
mysql> SELECT CAST( DATE(SYSDATE()) AS DATETIME ) > CAST( DATE(SYSDATE()) AS DATE )
AS test;
+------+
| test |
+------+
| 1 |
+------+
5.0.77
mysql> SELECT CAST( DATE(SYSDATE()) AS DATETIME ) > CAST( DATE(SYSDATE()) AS DATE )
AS test;
+------+
| test |
+------+
| 0 |
+------+
DATE() 関数で日付の切り捨てをしていたりするプログラムは、注意を要する。
今までと同じ結果を得るためには、CAST() で明示的にDATETIME型に変換してやる必要があるようである。
CREATE TABLE datetest (
idnum INTEGER,
tdate DATETIME,
CONSTRAINT pk_datetest PRIMARY KEY (idnum)
);
INSERT INTO datetest (idnum,tdate)
VALUES(1,STR_TO_DATE('2011/04/04','%Y/%m/%d'));
INSERT INTO datetest (idnum,tdate)
VALUES(2,STR_TO_DATE('2011/04/04 12:00:00','%Y/%m/%d %H:%i:%s'));
-- 5.0.77の場合 SYSDATEは11/04/04 07:00:00
mysql> SELECT * FROM datetest WHERE tdate <= DATE(SYSDATE());
+-------+---------------------+
| idnum | tdate |
+-------+---------------------+
| 1 | 2011-04-04 00:00:00 |
+-------+---------------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM datetest WHERE tdate <= CAST( DATE(SYSDATE()) AS DATETIME );
+-------+---------------------+
| idnum | tdate |
+-------+---------------------+
| 1 | 2011-04-04 00:00:00 |
+-------+---------------------+
1 row in set (0.00 sec)
-- 5.5.10の場合 SYSDATEは11/04/04 07:00:00
mysql> SELECT * FROM datetest WHERE tdate <= DATE(SYSDATE()); -- 5.0.77と違う結果が返される
Empty set (0.00 sec)
mysql> SELECT * FROM datetest WHERE tdate <= CAST( DATE(SYSDATE()) AS DATETIME );
+-------+---------------------+
| idnum | tdate |
+-------+---------------------+
| 1 | 2011-04-04 00:00:00 |
+-------+---------------------+
1 row in set (0.00 sec)
▼レンタルサーバー・VPS比較表を見る▼