コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

MySQLのdatetimeとdateで比較した場合、date側に00:00:00の時刻情報が追加される

どういう仕組みかわからなかったので調べた

環境

$ mysql --version
mysql  Ver 14.14 Distrib 5.7.24, for osx10.14 (x86_64) using  EditLine wrapper

マニュアル曰く

マニュアルには以下のようにある

DATE 値には時間情報が含まれないので、DATETIME または TIMESTAMP 値に変換すると、'00:00:00' の時間部分が追加されます。 - MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.3.7 日付と時間型間での変換

考慮すべきケース

Railsなどではおなじみ created_at 、こちら大体は datetime の型で作成されるが、そこに対して 2019-08-17 以前のデータを取ろうとして以下のようなSQLを書く

SELECT * FROM users WHERE created_at <= "2019-08-17";

直感的には取れそうだが、下記と同義になるため、実際は意図と異なってしまう

SELECT * FROM users WHERE created_at <= "2019-08-17 00:00:00";

関連リンク