web-dev-qa-db-fra.com

MySQL SELECT WHERE date / heure correspond au jour (et pas nécessairement à l'heure)

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
115
user1032531

JAMAIS JAMAIS utilisez un sélecteur tel que DATE(datecolumns) = '2012-12-24' - c’est un tueur performant:

  • il calculera DATE() pour toutes les lignes, y compris celles qui ne correspondent pas
  • il sera impossible d'utiliser un index pour la requête

C'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.

296
Eugen Rieck

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

30
a1ex07

Vous pouvez utiliser %:

SELECT * FROM datetable WHERE datecol LIKE '2012-12-25%'
18
Ghilas BELHADJ