MySQLの DateTime型の比較で困った話

プログラマー

MySQLで日時が一致しない!

現職では MySQL 5.1系を使ったオンプレミス環境でお仕事しています。
その中でデータベースのあるテーブルから「予定が 2018年8月1日」のデータを抽出しようとした時、以下のクエリではデータが存在するにも関わらず一致するデータが見つかりませんでした。

一致しないクエリ

SELECT * FROM table WHERE plan_column = '2018-08-01 00:00:00 ';
それを以下のように修正すると一致してデータが抽出できるようになりました。
一致するクエリ

SELECT * FROM table WHERE plan_column = '2018-08-01 00:00:00';
違いがわかるでしょうか?

謎の挙動の原因は…

正解は ‘2018-08-01 00:00:00’ の末尾の空白の有無です。
詳しくは調べていませんが、末尾に空白があるとミリ秒単位まで比較してしまうのかもしれません。

困ったことに MySQL Connector/Netのパラメーター機能を使うと「一致しないクエリ」の方でクエリが生成させてしまうのですよね…。やむを得ないのでパラメーター機能ではなく StringBuilderで直接クエリを作成してデータを抽出しました。

最新の MySQLでは修正されている挙動かもしれませんが、DateTime型のデータを抽出条件にする時は注意しましょう。