318 votes

Comment effectuer une requête entre deux dates avec MySQL ?

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 de données que nécessaire pour que la requête fonctionne. Qu'est-ce que je fais de mal ?

590voto

Daniel Vandersluis Points 30498

Votre deuxième date est antérieure à la première (c'est-à-dire que vous faites une requête 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')

32voto

Nik Points 1832

Votre requête devrait avoir la date comme

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

essayez

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

26voto

Rocket Hazmat Points 87407

Est date_field de type datetime ? Vous devez également mettre la date la plus ancienne en premier.

Il devrait l'être :

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

22voto

sabin Points 476

DATE() est une fonction MySQL qui extrait uniquement la partie date d'une expression de date ou de date/heure.

SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';

17voto

ltlBeBoy Points 398

Comme extension à la réponse de @sabin et comme indication si l'on veut comparer les date partie seulement (sans l'heure) :

Si le champ à comparer est de type datetime et seulement dates sont spécifiés à des fins de comparaison, alors ces dates sont convertis en interne en datetime valeurs. 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')

en interne.

Cela conduit à un résultat qui n'inclut pas les objets du 2010-09-29 dont la valeur temporelle est supérieure à 00:00:00 !

Ainsi, si tous les objets portant 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')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X