web-dev-qa-db-fra.com

MySQL compare la chaîne DATE avec la chaîne du champ DATETIME

J'ai une question: Est-il possible de sélectionner une base de données MySQL en comparant une chaîne DATE "2010-04-29" à des chaînes stockées sous le nom DATETIME (2010-04-29 10:00)?

J'ai un sélecteur de date qui filtre les données et je voudrais interroger la table par le champ DATETIME comme ceci:

SELECT * FROM `calendar` WHERE startTime = '2010-04-29'"

... et j'aimerais obtenir la ligne dont la valeur DATETIME est "2010-04-29 10:00".

Aucune suggestion? Merci.

80
Manny Calavera

Utilisez le suivant:

SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'

Juste pour référence, j'ai une table d'enregistrement de 2 millions de dollars, j'ai lancé une requête similaire. Salils réponse a pris 4,48 secondes, ce qui précède a pris 2,25 secondes.

Donc, si le tableau est grand, je le suggérerais plutôt.

140
David

Si vous souhaitez sélectionner toutes les lignes pour lesquelles la partie DATE d'une colonne DATETIME correspond à un littéral donné, vous ne pouvez pas le faire comme ceci:

WHERE startTime = '2010-04-29'

parce que MySQL ne peut pas comparer directement une DATE et une DATETIME. Ce que MySQL fait, il étend le littéral DATE donné avec le temps '00: 00: 00 '. Donc, votre état devient

WHERE startTime = '2010-04-29 00:00:00'

Certainement pas ce que vous voulez!

La condition est une plage et par conséquent elle devrait être donnée comme plage. Il y a plusieurs possibilités:

WHERE startTime BETWEEN '2010-04-29 00:00:00' AND '2010-04-29 23:59:59'
WHERE startTime >= '2010-04-29' AND startTime < ('2010-04-29' + INTERVAL 1 DAY)

La première possibilité que le premier se trompe est minime - lorsque votre colonne DATETIME utilise une résolution inférieure à la seconde et qu'il existe un rendez-vous à 23:59:59 + epsilon. En général, je suggère d'utiliser la deuxième variante.

Les deux variantes peuvent utiliser un index sur startTime qui deviendra important lorsque la table s'agrandira.

31
XL_
SELECT * FROM `calendar` WHERE DATE_FORMAT(startTime, "%Y-%m-%d") = '2010-04-29'"

OR

SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'
21
Salil
SELECT * FROM sample_table WHERE last_visit = DATE_FORMAT('2014-11-24 10:48:09','%Y-%m-%d %H:%i:%s')

ceci pour le format de date et heure dans mysql en utilisant DATE_FORMAT(date,format).

1
R T
SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29';

cela aide, vous pouvez convertir les valeurs en tant que DATE avant de comparer.

1
Sarath