J'ai une colonne de type "datetime" avec des valeurs telles que 2009-10-20 10:00:00
Je voudrais extraire la date de datetime et écrire une requête comme celle-ci:
SELECT * FROM
data
WHERE datetime = '2009-10-20'
ORDER BY datetime DESC
Le suivant est-il la meilleure façon de le faire?
SELECT * FROM
data
WHERE datetime BETWEEN('2009-10-20 00:00:00' AND '2009-10-20 23:59:59')
ORDER BY datetime DESC
Cela retourne cependant un résultat vide. Aucune suggestion?
Vous pouvez utiliser la fonction DATE()
de MySQL:
WHERE DATE(datetime) = '2009-10-20'
Vous pouvez aussi essayer ceci:
WHERE datetime LIKE '2009-10-20%'
Voir cette réponse pour plus d'informations sur les implications pour les performances de l'utilisation de LIKE
.
L'utilisation de WHERE DATE(datetime) = '2009-10-20'
présente des problèmes de performances . Comme indiqué ici :
DATE()
pour toutes les lignes, y compris celles qui ne correspondent pasUtilisez les opérateurs BETWEEN
ou >
, <
, =
permettant d’utiliser un index:
SELECT * FROM data
WHERE datetime BETWEEN '2009-10-20 00:00:00' AND '2009-10-20 23:59:59'
Mise à jour: l'impact sur l'utilisation de LIKE
au lieu d'opérateurs dans une colonne indexée est élevé . Voici quelques résultats de test sur une table de 1 176 000 lignes:
datetime LIKE '2009-10-20%'
=> 2931msdatetime >= '2009-10-20 00:00:00' AND datetime <= '2009-10-20 23:59:59'
=> 168msLors d'un deuxième appel sur la même requête, la différence est encore plus grande: 2984ms vs 7ms (oui, seulement 7 millisecondes!). J'ai trouvé cela lors de la réécriture d'un ancien code sur un projet utilisant Hibernate.
Vous pouvez formater la date et l'heure à la partie Y-M-D:
DATE_FORMAT(datetime, '%Y-%m-%d')
Bien que toutes les réponses sur la page donnent le résultat souhaité, elles ont toutes des problèmes de performances. N'effectuez jamais de calculs sur les champs de la clause WHERE
(y compris un calcul DATE()
, car ce calcul doit être effectué sur toutes les lignes de la table.
La construction BETWEEN ... AND
est inclusive pour les deux conditions à la frontière, ce qui oblige à spécifier la syntaxe 23:59:59 à la date de fin, ce qui pose d'autres problèmes (transactions en microsecondes, que MySQL n'a pas prises en charge en 2009 lorsque a été demandé).
La méthode appropriée pour interroger un champ MySQL timestamp
pour un jour particulier consiste à rechercher la valeur supérieure ou égale à la date souhaitée et la valeur inférieure pour le jour suivant, sans heure spécifiée.
WHERE datetime>='2009-10-20' AND datetime<'2009-10-21'
Il s’agit de la méthode la plus rapide, la moins gourmande en mémoire et la moins gourmande en ressources. Elle prend également en charge toutes les fonctionnalités MySQL et les cas extrêmes, telles que la précision de l’horodatage inférieur à une seconde. En outre, il est à l'épreuve du futur.
Disons que ceci est la colonne qui contient la valeur datetime
, table data
.
+--------------------+
| date_created |
+--------------------+
| 2018-06-02 15:50:30|
+--------------------+
mysql> select DATE(date_created) from data;
+--------------------+
| DATE(date_created) |
+--------------------+
| 2018-06-02 |
+--------------------+
mysql> select YEAR(date_created) from data;
+--------------------+
| YEAR(date_created) |
+--------------------+
| 2018 |
+--------------------+
mysql> select MONTH(date_created) from data;
+---------------------+
| MONTH(date_created) |
+---------------------+
| 6 |
+---------------------+
mysql> select DAY(date_created) from data;
+-------------------+
| DAY(date_created) |
+-------------------+
| 2 |
+-------------------+
mysql> select HOUR(date_created) from data;
+--------------------+
| HOUR(date_created) |
+--------------------+
| 15 |
+--------------------+
mysql> select MINUTE(date_created) from data;
+----------------------+
| MINUTE(date_created) |
+----------------------+
| 50 |
+----------------------+
mysql> select SECOND(date_created) from data;
+----------------------+
| SECOND(date_created) |
+----------------------+
| 31 |
+----------------------+
Vous pouvez utiliser:
DATEDIFF ( day , startdate , enddate ) = 0
Ou:
DATEPART( day, startdate ) = DATEPART(day, enddate)
AND
DATEPART( month, startdate ) = DATEPART(month, enddate)
AND
DATEPART( year, startdate ) = DATEPART(year, enddate)
Ou:
CONVERT(DATETIME,CONVERT(VARCHAR(12), startdate, 105)) = CONVERT(DATETIME,CONVERT(VARCHAR(12), enddate, 105))
moyen simple et meilleur d'utiliser la fonction date
exemple
SELECT * FROM
data
WHERE date(datetime) = '2009-10-20'
OR
SELECT * FROM
data
WHERE date(datetime ) >= '2009-10-20' && date(datetime ) <= '2009-10-20'