La requête suivante:
SELECT * FROM `objects`
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')
ne renvoie rien.
Je devrais avoir plus qu'assez de données pour que la requête fonctionne. Qu'est-ce que je fais mal?
La requête suivante:
SELECT * FROM `objects`
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')
ne renvoie rien.
Je devrais avoir plus qu'assez de données pour que la requête fonctionne. Qu'est-ce que je fais mal?
Réponses:
Votre deuxième date est antérieure à votre première date (c'est-à-dire que vous interrogez entre le 29 septembre 2010 et le 30 janvier 2010). Essayez d'inverser l'ordre des dates:
SELECT *
FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
where
clause devrait fonctionner de la même manière sur les instructions select
or update
.
Est date_field
de type datetime
? Vous devez également mettre la date du eariler en premier.
Ça devrait être:
SELECT * FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
DATE () est une fonction MySQL qui extrait uniquement la partie date d'une expression date ou date / heure
SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';
Comme extension à la réponse de @sabin et un indice si l'on veut comparer la partie date uniquement (sans l'heure):
Si le champ à comparer est du type datetime et que seules les dates sont spécifiées pour la comparaison, ces dates sont converties en interne en valeurs datetime . Cela signifie que la requête suivante
SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30' AND '2010-09-29')
sera converti en
SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30 00:00:00' AND '2010-09-29 00:00:00')
intérieurement.
Cela entraîne à son tour un résultat qui n'inclut pas les objets du 29/09/2010 avec une valeur de temps supérieure à 00:00:00!
Ainsi, si tous les objets avec la date 2010-09-29 doivent également être inclus, le champ à comparer doit être converti en date:
SELECT * FROM `objects` WHERE (DATE(date_time_field) BETWEEN '2010-01-30' AND '2010-09-29')
Vous pouvez le faire manuellement, en comparant avec supérieur ou égal et inférieur ou égal.
select * from table_name where created_at_column >= lower_date and created_at_column <= upper_date;
Dans notre exemple, nous devons récupérer des données d'un jour en particulier. Nous comparerons du début de la journée à la dernière seconde d'un autre jour.
select * from table_name where created_at_column >= '2018-09-01 00:00:00' and created_at_column <= '2018-09-05 23:59:59';
Peut-être un problème avec la configuration de la date côté serveur ou côté client. J'ai trouvé que c'était un problème commun sur plusieurs bases de données lorsque l'hôte est configuré en espagnol, français ou autre ... qui pourrait affecter le format jj / mm / aaaa ou mm / jj / aaaa.
Lorsque vous utilisez des valeurs de date et d' heure, vous devez convertir les champs en tant que DateTime
et non Date
. Essayez:
SELECT * FROM `objects`
WHERE (CAST(date_field AS DATETIME)
BETWEEN CAST('2010-09-29 10:15:55' AS DATETIME) AND CAST('2010-01-30 14:15:55' AS DATETIME))
min
etmax
sont considérées comme étant dans la plage, pour ne pas traiter deux fois une date qui est la valeurmin
etmax
(cas de bord). Par exemple, la date2010-09-29 00:00:00
sera comprise entre2010-09-28 00:00:00
et2010-09-29 00:00:00
, ET AUSSI entre2010-09-29 00:00:00
et2010-09-30 00:00:00