web-dev-qa-db-fra.com

Comment sélectionner la date depuis la colonne datetime?

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?

210
mysqllearner

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.

394
Priyank Bolia

L'utilisation de WHERE DATE(datetime) = '2009-10-20' présente des problèmes de performances . Comme indiqué ici :

  • 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

Utilisez 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:

  • using datetime LIKE '2009-10-20%' => 2931ms
  • using datetime >= '2009-10-20 00:00:00' AND datetime <= '2009-10-20 23:59:59' => 168ms

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

86
IvanRF

Vous pouvez formater la date et l'heure à la partie Y-M-D:

DATE_FORMAT(datetime, '%Y-%m-%d')
24
Prusprus

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.

12
dotancohen

Voici tous les formats

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 |
+----------------------+
8
Siraj Alam

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))
5
Michel van Engelen

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'