2009-11-18 9 views
159

J'ai une colonne de type « datetime » avec des valeurs comme 2009-10-20 10:00:00Comment sélectionner la date à partir de la colonne datetime?

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 qui suit 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 renvoie cependant un jeu de résultats vide. Aucune suggestion?

+0

Theres une erreur, fermez le "(" après la limite de données –

Répondre

289
WHERE DATE(datetime) = '2009-10-20' 

ou essayez ceci aussi et voyez si ça marche pas. Est-ce aide

WHERE datetime LIKE '2009-10-20%'

Vous devez vérifier whethere cela fonctionne sur non.

+2

essayé celui-ci: Où DATE (datetime) = '2009-10-20', cela fonctionne – mysqllearner

+30

Le premier est très lent et ignore les index. est mieux d'avoir LIKE 'date%' – kachar

+4

Le premier tue les performances de votre page! –

3

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)) 
-2

Eh bien, en utilisant comme dans l'instruction est la meilleure option où datetime comme « 2009-10 -20% ', il devrait fonctionner dans ce cas

18

Vous pouvez formater le datetime à la partie AMJ:

DATE_FORMAT(datetime, '%Y-%m-%d') 
+0

De cette façon, vous ne pouvez obtenir que la partie temps si nécessaire: 'DATE_FORMAT (datetime, '% H:% i:% S')' – Metafaniel

1

simple et la meilleure façon d'utiliser la fonction de la date

exemple

SELECT * FROM 
data 
WHERE date(datetime) = '2009-10-20' 

OU

SELECT * FROM 
data 
WHERE date(datetime) >= '2009-10-20' && date(datetime) <= '2009-10-20' 
52

L'utilisation WHERE DATE(datetime) = '2009-10-20'a problèmes de performance. Comme indiqué here:

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

Utilisez BETWEEN ou >, <, = opérateurs qui permettent 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 LIKE à la place des opérateurs dans une colonne indexée est élevée.Ce sont des résultats des tests sur une table avec 1,176,000 lignes:

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

Lorsque vous effectuez un second appel sur la même requête la différence est même plus haut: 2984ms vs 7ms (oui, seulement 7 millisecondes!). Je l'ai trouvé en réécrivant de l'ancien code sur un projet en utilisant Hibernate.

+0

Intéressant, si l'implémentation MySql convertit automatiquement 'DATE (datetime)' en 'BETWEEN AND' Bine les scènes nous obtenons une déclaration courte et une performance cool. Pourquoi pas? Pourquoi ils n'ont pas fait ça? :) – Cherry

6

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 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 de frontière, nécessitant de spécifier la syntaxe 23:59:59 à la date de fin qui a elle-même d'autres problèmes (transactions de microsecondes, que je crois que MySQL n'a pas supportées en 2009 quand le question a été posée). La bonne façon d'interroger un champ MySQL timestamp pour un jour particulier est de vérifier Supérieur à égal à la date souhaitée, et Inférieur au jour suivant, sans heure spécifiée.

WHERE datetime>='2009-10-20' AND datetime<'2009-10-21' 

Ceci est la méthode la plus rapide intensive performants, plus bas en mémoire, moins de ressources, et supporte en outre toutes les fonctions MySQL et angulaires des cas tels que la sous-deuxième précision d'horodatage. De plus, c'est la preuve du futur.

+1

Et, en utilisant votre argument de performance, les "> =" et "<" sont-ils également calculés sur chaque ligne de la table, ou le serveur SQL sait-il "magiquement" si un nombre est plus grand que l'autre? :-) –

+0

@JavierGuerrero: Mon exemple compare deux constantes: Une de la table et une chaîne littérale. – dotancohen

+0

Le "un de la table" n'est pas une constante, il varie pour chaque ligne, donc le même calcul doit être fait pour chaque ligne (et aussi, les deux doivent être convertis en temps de l'époque pour effectuer la comparaison) –

Questions connexes