MySQL DATE()函数有什么问题?

时间:2009-08-24 08:38:45

标签: mysql date

我使用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

回答Eric的询问:

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 个答案:

答案 0 :(得分:1)

这对我有用:

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

我能够重现列中第一个NULL值后比较失败的行为。

答案 1 :(得分:0)

看起来TO_DAYS函数对我的目的来说更加可靠 - 用DATE直接替换TO_DAYS似乎没问题。