2009-08-24 10 views
2

J'ai eu des résultats bizarres de questions que j'ai testé avec la fonction DATE, culminant dans ces petites beautés:Quel est le problème avec la fonction MySQL 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 | 
+------+ 

et pour un peu plus de comédie

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

nous donne :

+------+------------+ 
| 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  | 
+------+------------+ 

est sur ce 5.0.45

La fonction DATE() est-elle complètement non fiable ou manque-t-il quelque chose?

Clarifications:

Le champ due est de type datetime, et il n'y a pas eu de renversement de date dans l'intervalle entre les requêtes - toutes les requêtes mentionnées ci-dessus donnent toujours les mêmes résultats et NOW() est actuellement 2009-08-24 22:54:17

En réponse à la requête de 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  | 
+------+---------------------+------------+ 
+0

lol! (ou sanglot?) – Sklivvz

+0

Une question peut-être stupide: si vous l'essayez maintenant, cela vous donne-t-il les mêmes résultats? Peut-être que cette date a changé entre vos requêtes? – Quassnoi

+0

Quel est le type d'identifiant de colonne? est-ce un champ auto-increment/serial de type integer ou autre chose? – Parthan

Répondre

0

Il semble que la fonction TO_DAYS est beaucoup plus fiable pour mes besoins - un remplacement direct de DATE avec TO_DAYS semble se passer bien.

1

Cela a fonctionné pour moi:

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

J'ai été capable de reproduire le comportement où la comparaison a échoué après la première valeur NULL dans la colonne.

+0

Merci - il semble aussi que je puisse avoir 'WHERE à cause de NOT NULL AND ...' au lieu de la sous-requête, mais je suis un peu hésitant à utiliser 'DATE' à tous maintenant. – Cebjyre

Questions connexes