J'ai une table qui contient une colonne datetime. Je souhaite renvoyer tous les enregistrements d'un jour donné, quelle que soit l'heure. Autrement dit, si ma table ne contenait que les 4 enregistrements suivants, seuls les 2e et 3e seraient renvoyés si je limitais au 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
JAMAIS JAMAIS utilisez un sélecteur tel que DATE(datecolumns) = '2012-12-24'
- c’est un tueur performant:
DATE()
pour toutes les lignes, y compris celles qui ne correspondent pasC'est beaucoup plus rapide à 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 l'a souligné Used_By_Already, depuis la réponse initiale, en 2012, de nouvelles versions de MySQL ont vu le jour, où l'utilisation de '23: 59: 59 'comme fin de journée n'était plus sans danger. Une version mise à jour devrait se lire
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, c’est-à-dire l’évitement du sélecteur sur une expression calculée, est toujours valable.
... WHERE date_column >='2012-12-25' AND date_column <'2012-12-26'
peut éventuellement mieux fonctionner (si vous avez un index sur date_column) que DATE
.
Vous pouvez utiliser %
:
SELECT * FROM datetable WHERE datecol LIKE '2012-12-25%'