現象
実行環境
OS: Ubuntu 18.04.1 LTS
MySQL: 5.7.29
mysql> SELECT CASE WHEN '2020-03-27 00:00:00' < '2020-1-1 0:0:0' THEN 'そうです(大嘘)' ELSE 'んなわけないでしょ……' END AS '2020年1月1日は 2020年3月27日より未来?';
--------------
SELECT CASE WHEN '2020-03-27 00:00:00' < '2020-1-1 0:0:0' THEN 'そうです(大嘘)' ELSE 'んなわけないでしょ……' END AS '2020年1月1日は 2020年3月27日より未来?'
--------------
+----------------------------------------------------+
| 2020年1月1日は 2020年3月27日より未来? |
+----------------------------------------------------+
| そうです(大嘘) |
+----------------------------------------------------+
1 row in set (0.00 sec)
ファッッッッッッ?????!!!??!!!??!!!?!!?!!?!??!?!?!!!??
書式を合わせて再実行
上記の SQL をよく見てみると、比較している日付の書式が 2020-03-27 00:00:00
と 2020-1-1 0:0:0
で書式が違っています。
試しに 2020-1-1 0:0:0
の方を MySQL の推奨形式である YYYY-mm-dd HH:ii:ss
形式(自称 山田ヒステリック形式)に変えて実行してしましょう。
mysql> SELECT CASE WHEN '2020-03-27 00:00:00' < '2020-01-01 00:00:00' THEN 'そうです(大嘘)' ELSE 'んなわけないでしょ……' END AS '2020年1月1日は 2020年3月27日より未来?';
--------------
SELECT CASE WHEN '2020-03-27 00:00:00' < '2020-01-01 00:00:00' THEN 'そうです(大嘘)' ELSE 'んなわけないでしょ……' END AS '2020年1月1日は 2020年3月27日より未来?'
--------------
+----------------------------------------------------+
| 2020年1月1日は 2020年3月27日より未来? |
+----------------------------------------------------+
| んなわけないでしょ…… |
+----------------------------------------------------+
1 row in set (0.00 sec)
期待通りの動作になりました。
書式を合わせずに UNIX_TIMESTAMP() を挟んで再実行
MySQL には時刻の文字列をタイムスタンプに変換できる UNIX_TIMESTAMP
関数が存在するので、書式の違う両者日時文字列を変換した上で再実行してみましょう。
mysql> SELECT CASE WHEN UNIX_TIMESTAMP('2020-03-27 00:00:00') < UNIX_TIMESTAMP('2020-01-01 00:00:00') THEN 'そうです(大嘘)' ELSE 'んなわけないでしょ……' END AS '2020年1月1日は 2020年3月27日より未来?';
--------------
SELECT CASE WHEN UNIX_TIMESTAMP('2020-03-27 00:00:00') < UNIX_TIMESTAMP('2020-01-01 00:00:00') THEN 'そうです(大嘘)' ELSE 'んなわけないでしょ……' END AS '2020年1月1日は 2020年3月27日より未来?'
--------------
+----------------------------------------------------+
| 2020年1月1日は 2020年3月27日より未来? |
+----------------------------------------------------+
| んなわけないでしょ…… |
+----------------------------------------------------+
1 row in set (0.00 sec)
これも期待通りですね。アプリケーション側での対処が難しい場合はこちらで解決してもいいかもしれません。