J'ai une colonne de type "datetime" avec des valeurs comme 2009-10-20 10:00:00
Je voudrais extraire la date de datetime et écrire une requête comme:
SELECT * FROM
data
WHERE datetime = '2009-10-20'
ORDER BY datetime DESC
Est-ce que la meilleure façon de procéder est la suivante?
SELECT * FROM
data
WHERE datetime BETWEEN('2009-10-20 00:00:00' AND '2009-10-20 23:59:59')
ORDER BY datetime DESC
Cela renvoie cependant un jeu de résultats vide. Aucune suggestion?
L'utilisation
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 pas.Utilisez
BETWEEN
ou>
,<
, les=
opérateurs qui permettent d'utiliser un indice:Mise à jour: l' impact sur l'utilisation
LIKE
au lieu d'opérateurs dans une colonne indexée est élevé . Voici quelques résultats de test sur une table avec 1 176 000 lignes:datetime LIKE '2009-10-20%'
=> 2931msdatetime >= '2009-10-20 00:00:00' AND datetime <= '2009-10-20 23:59:59'
=> 168 msLorsque vous effectuez un deuxième appel sur la même requête, la différence est encore plus élevée: 2984 ms contre 7 ms (oui, seulement 7 millisecondes!). J'ai trouvé cela en réécrivant un ancien code sur un projet utilisant Hibernate.
la source
DATE(datetime)
pourBETWEEN AND
améliorer les scènes, nous obtenons une déclaration courte et des performances intéressantes. Pourquoi pas? Pourquoi ne l'ont-ils pas fait? :)DATE(datetime) in (:list)
marche pasBETWEEN
Vous pouvez formater le datetime à la partie YMD:
la source
DATE_FORMAT(datetime, '%H:%i:%S')
Bien que toutes les réponses sur la page renvoient le résultat souhaité, elles ont toutes des problèmes de performances. N'effectuez jamais de calculs sur les champs de la
WHERE
clause (y compris unDATE()
calcul) car ce calcul doit être effectué sur toutes les lignes du tableau.La
BETWEEN ... AND
construction est inclusive pour les deux conditions de frontière, exigeant que l'on spécifie la syntaxe 23:59:59 à la date de fin qui elle-même a d'autres problèmes (transactions en microsecondes, que je crois que MySQL n'a pas pris en charge en 2009 lorsque la question a été posée).La bonne façon d'interroger un
timestamp
champ MySQL pour un jour particulier est de vérifier si Supérieur à Egal par rapport à la date souhaitée et Inférieur à jour après, sans heure spécifiée.Il s'agit de la méthode la plus rapide, la moins gourmande en mémoire et la moins gourmande en ressources, et prend également en charge toutes les fonctionnalités MySQL et les cas d'angle tels que la précision d'horodatage en une seconde. De plus, il est à l'épreuve du temps.
la source
Voici tous les formats
Disons que c'est la colonne qui contient la
datetime
valeur, tabledata
.la source
Vous pouvez utiliser:
Ou:
Ou:
la source
façon simple et optimale d'utiliser la fonction de date
exemple
OU
la source
Eh bien, utiliser
LIKE
dans la déclaration est la meilleure option,WHERE datetime LIKE '2009-10-20%'
cela devrait fonctionner dans ce casla source