web-dev-qa-db-fra.com

Comment interroger MySQL entre deux dates?

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 bien. Qu'est-ce que je fais mal?

184
NullVoxPopuli

Votre deuxième date est antérieure à votre première date (c.-à-d. 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')
383
Daniel Vandersluis

Votre requête doit avoir une date comme 

select * from table between `lowerdate` and `upperdate`

essayer

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
22
Nik

Est-ce que date_field est de type datetime_? Aussi, vous devez mettre la date la plus proche en premier.

CA devrait etre:

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
15
Rocket Hazmat

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';
11
sabin

En guise d'extension à la réponse de @sabin et d'un indice si l'on veut comparer uniquement la partie date (sans l'heure):

Si le champ à comparer est de type datetime et que seules 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 aboutit à un résultat n'incluant 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 une date:

SELECT * FROM `objects` WHERE (DATE(date_time_field) BETWEEN '2010-01-30' AND '2010-09-29')
5
ltlBeBoy

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 extraire des données d’un jour à l’autre. 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';
3
Fahd Allebdi

Peut-être un problème de configuration de la date côté serveur ou côté client ..__J'ai constaté qu'il s'agit d'un problème courant sur plusieurs bases de données lorsque l'hôte est configuré en espagnol, en français ou ailleurs, ce qui peut affecter le format jj/mm/aaaa ou mm/jj/aaaa.

1
SoulWanderer

Si vous utilisez les valeurs Date et Time, vous devez convertir les champs en DateTime et non Date.

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))
1
Bruno Barral

Essayez de changer les dates autour de:

2010-09-29 > 2010-01-30?
0
Jure1873

Indiquez simplement date_field comme date 

SELECT * FROM `objects` 
WHERE (cast(date_field as date) BETWEEN '2010-09-29' AND 
'2010-01-30' )
0
DS Mercy