Что не так с функцией MySQL DATE ()? - PullRequest
2 голосов
/ 24 августа 2009

Я получил несколько странных результатов от запросов, которые я тестировал с помощью функции DATE, кульминацией которой стали маленькие прелести:

mysql> SELECT id FROM job WHERE DATE(due)=CURRENT_DATE;
Empty set (0.00 sec)

mysql> SELECT id FROM job WHERE DATE(due)=CURRENT_DATE AND id>2022;
Empty set (0.00 sec)

mysql> SELECT id FROM job WHERE DATE(due)=CURRENT_DATE AND id=2023;
+------+
| id   |
+------+
| 2023 | 
+------+

и немного больше комедии

mysql> SELECT id, DATE(due) FROM job WHERE DATE(due) IS NULL AND id>2022;

дает нам:

+------+------------+
| id   | DATE(due)  |
+------+------------+
| 2023 | 2009-08-24 | 
| 2024 | 2009-08-24 | 
| 2025 | NULL       | 
| 2026 | 2009-08-24 | 
| 2027 | NULL       | 
| 2032 | NULL       | 
| 2031 | NULL       | 
| 2033 | NULL       | 
| 2034 | NULL       | 
| 2035 | NULL       | 
| 2036 | NULL       | 
| 2037 | NULL       | 
| 2038 | NULL       | 
+------+------------+

это на 5.0.45

Является ли функция DATE() полностью ненадежной, или я что-то упустил?

Разъяснения:

Поле срока действия имеет тип datetime, и за прошедший период между запросами не было смены даты - все упомянутые выше запросы все еще дают те же результаты, и NOW() в настоящее время 2009-08-24 22:54:17

В ответ на запрос Эрика:

mysql> SELECT id, due, DATE(due) FROM job WHERE id>2022;
+------+---------------------+------------+
| id   | due                 | DATE(due)  |
+------+---------------------+------------+
| 2023 | 2009-08-24 00:00:00 | 2009-08-24 | 
| 2024 | 2009-08-24 17:20:56 | 2009-08-24 | 
| 2025 | NULL                | NULL       | 
| 2026 | 2009-08-24 17:22:07 | 2009-08-24 | 
| 2027 | NULL                | NULL       | 
| 2032 | NULL                | NULL       | 
| 2031 | NULL                | NULL       | 
| 2033 | NULL                | NULL       | 
| 2034 | NULL                | NULL       | 
| 2035 | NULL                | NULL       | 
| 2036 | NULL                | NULL       | 
| 2037 | NULL                | NULL       | 
| 2038 | NULL                | NULL       | 
+------+---------------------+------------+

Ответы [ 2 ]

1 голос
/ 24 августа 2009

Это сработало для меня:

SELECT id FROM (SELECT * FROM job WHERE due IS NOT NULL) job_not_null WHERE DATE(due) = CURRENT_DATE

Мне удалось воспроизвести поведение, при котором сравнение не удалось выполнить после первого значения NULL в столбце.

0 голосов
/ 25 августа 2009

Похоже, что функция TO_DAYS намного более надежна для моих целей - прямая замена DATE на TO_DAYS, кажется, идет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...