J'ai une table qui contient une colonne de date. Je souhaite renvoyer tous les enregistrements d'un jour donné, quelle que soit l'heure. En d'autres termes, si ma table ne contient que les 4 enregistrements suivants, seuls les 2e et 3e seront renvoyés si je limite à 2012-12-25.
2012-12-24 00:00:00
2012-12-25 00:00:00
2012-12-25 06:00:00
2012-12-26 05:00:00
N'utilisez JAMAIS JAMAIS un sélecteur comme DATE(datecolumns) = '2012-12-24'
- c'est un tueur de performances :
DATE()
pour toutes les lignes, y compris celles qui ne correspondent pas.Il est beaucoup plus rapide d'utiliser
SELECT * FROM tablename
WHERE columname BETWEEN '2012-12-25 00:00:00' AND '2012-12-25 23:59:59'
car cela permettra l'utilisation de l'index sans calcul.
EDIT
Comme indiqué par Used_By_Already, depuis la réponse initiale de 2012, des versions de MySQL sont apparues, où l'utilisation de '23:59:59' ; comme fin de journée n'est plus sûre. Une version mise à jour devrait être la suivante
SELECT * FROM tablename
WHERE columname >='2012-12-25 00:00:00'
AND columname <'2012-12-26 00:00:00'
L'essentiel de la réponse, à savoir éviter l'utilisation d'un sélecteur sur une expression calculée, reste bien sûr valable.