2009-11-20 6 views
1

Lorsque j'utilise cette requête:comportement MySQL DATEDIFF Incohérence

SELECT COUNT(*) FROM `my_table` WHERE DATEDIFF(NOW(), updated) > 2 

MySQL exécute la requête sans erreur et je reçois le nombre de lignes qui ne sont pas mises à jour au cours des 2 derniers jours. Cependant, si je change la requête comme ceci:

SELECT * FROM `my_table` WHERE DATEDIFF(NOW(), updated) > 2 

Je reçois l'erreur suivante:

#1305 - FUNCTION mydatabase.DATEDIFF does not exist 

Toutes les idées pourquoi il en est ainsi?

Répondre

2

J'ai eu un problème similaire où il ne fonctionnerait pas sur SELECT si je n'avais pas défini la limite.

Essayez de faire quelque chose comme:

SELECT * FROM `my_table` WHERE DATEDIFF(NOW(), updated) > 2 LIMIT 0, 10 

Il a obtenu corrigé sur une mise à jour MySQL. Essayez de mettre à jour votre version de MySQL également.

+1

Il est intéressant de noter que phpMyAdmin ajoutait une clause LIMIT avant d'exécuter la requête, ce qui échoue. Si j'ajoute la LIMIT à la requête moi-même, comme vous le suggérez, la requête s'exécute correctement. Doit être un bug dans phpMyAdmin version 2.6.4-pl3. Merci pour l'aide. – Geoff

3

Vérifiez que vous n'avez pas d'espace entre DATEDIFF et le crochet (.

Peut-être vous pouvez également essayer SET sql_mode = "IGNORE_SPACE";

Vérifiez également ce bugreport.

+0

Merci pour la réponse. Je n'ai définitivement pas d'espace quand j'entre la requête en utilisant phpMyAdmin. Cependant, il se peut que phpMyAdmin modifie la requête avant qu'elle ne soit exécutée. À titre expérimental, j'ai essayé une version plus récente de phpMyAdmin (3.1.3.1) sur mon localhost, qui a très bien exécuté la requête de problème. Sur mon serveur de production (hébergé par un tiers), la version de phpMyAdmin est 2.6.4-pl3. Sur mon serveur de production, phpMyAdmin est le seul moyen que j'ai d'exécuter une requête ad hoc, puisque je n'ai pas d'accès direct au shell mysql. – Geoff

+0

Eh bien, vous pouvez vous assurer que phpMyAdmin ne modifie pas la chaîne de requête et en ajoutant un espace en définissant sql_mode à '" IGNORE_SPACE "'. Si cela n'aide pas comme Frankie et les personnes dans le rapport de bogue ont suggéré, l'ajout de LIMIT le fait apparemment analyser correctement. –