Краткий ответ:
Используйте CAST(... AS DATE)
Длинный ответ:
С MySQL DATE тип :
Разрешен «расслабленный» синтаксис: любой
знак пунктуации может использоваться как
разделитель между частями даты или
части времени Например, '98 -12-31
11:30:45 ', '98 .12.31 11 + 30 + 45',
'98 / 12/31 11 * 30 * 45 'и '98 @ 12 @ 31
11 ^ 30 ^ 45 'эквивалентны.
В ваших примерах 1 и 2 вы используете ADDDATE ... это всегда возвращает дату с разделителем '-', независимо от формата ввода:
+-----------------------------------------------+
| ADDDATE('2008/10/31 23:59:59',INTERVAL 1 DAY) |
+-----------------------------------------------+
| 2008-11-01 23:59:59 |
+-----------------------------------------------+
Вы также используете IFNULL, который теряет информацию о типе, поэтому при сравнении он сравнивается как строки.
Что вы можете сделать, это привести это к дате:
mysql> SELECT IFNULL(null, ADDDATE('2008/10/31 23:59:59',INTERVAL 1 DAY)) > '2008/10/31 23:59:59';
+-------------------------------------------------------------------------------------+
| IFNULL(null, ADDDATE('2008/10/31 23:59:59',INTERVAL 1 DAY)) > '2008/10/31 23:59:59' |
+-------------------------------------------------------------------------------------+
| 0 |
+-------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT CAST(IFNULL(null, ADDDATE('2008/10/31 23:59:59',INTERVAL 1 DAY)) AS DATE) > '2008/10/31 23:59:59';
+---------------------------------------------------------------------------------------------------+
| CAST(IFNULL(null, ADDDATE('2008/10/31 23:59:59',INTERVAL 1 DAY)) AS DATE) > '2008/10/31 23:59:59' |
+---------------------------------------------------------------------------------------------------+
| 1 |
+---------------------------------------------------------------------------------------------------+