1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MySQL の CASE 文中で書式の違う時刻を比較してはならぬ

Posted at

現象

実行環境
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日より未来?'
--------------

+----------------------------------------------------+
| 202011日は 2020327日より未来?             |
+----------------------------------------------------+
| そうです(大嘘)                                   |
+----------------------------------------------------+
1 row in set (0.00 sec)

ファッッッッッッ?????!!!??!!!??!!!?!!?!!?!??!?!?!!!??

書式を合わせて再実行

上記の SQL をよく見てみると、比較している日付の書式が 2020-03-27 00:00:002020-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日より未来?'
--------------

+----------------------------------------------------+
| 202011日は 2020327日より未来?             |
+----------------------------------------------------+
| んなわけないでしょ……                               |
+----------------------------------------------------+
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日より未来?'
--------------

+----------------------------------------------------+
| 202011日は 2020327日より未来?             |
+----------------------------------------------------+
| んなわけないでしょ……                               |
+----------------------------------------------------+
1 row in set (0.00 sec)

これも期待通りですね。アプリケーション側での対処が難しい場合はこちらで解決してもいいかもしれません。

1
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?