Comment interroger entre deux dates en utilisant MySQL?

225

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?

NullVoxPopuli
la source
32
Soyez prudent avec BETWEEN, car les deux valeurs minet maxsont considérées comme étant dans la plage, pour ne pas traiter deux fois une date qui est la valeur minet max(cas de bord). Par exemple, la date 2010-09-29 00:00:00sera comprise entre 2010-09-28 00:00:00et2010-09-29 00:00:00 , ET AUSSI entre 2010-09-29 00:00:00et2010-09-30 00:00:00
minipif
oui, ce qu'il a dit ^^
Albert Rannetsperger

Réponses:

472

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')
Daniel Vandersluis
la source
Je le savais, mais j'ai maintenant un problème avec UPDATE. J'essaie d'utiliser BETWEEN pour UPDATE, cela devrait-il fonctionner de la même manière?
Ingus
3
@IngusGraholskis: une whereclause devrait fonctionner de la même manière sur les instructions selector update.
T30
Personnellement, je trouve le terme «de» et «à» une façon sournoise de se souvenir de l'ordre dans lequel la requête doit être écrite.
KeaganFouche
Comment renvoyer toutes les données si les deux dates sont nulles ou vides?
Coding world
23

La date de votre requête doit être

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')
Nik
la source
20

Est date_fieldde 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')
Rocket Hazmat
la source
17

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';
sabin
la source
vous pouvez ajouter une explication pour que les gens comprennent ce que vous faites.
Franz Gleichmann
7

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')
ltlBeBoy
la source
4

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';
Fahd Allebdi
la source
1

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.

SoulWanderer
la source
3
Le problème était que la date la plus ancienne était répertoriée avant la date la plus récente.
theninjagreg
1

Just Cast date_field as date

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

Lorsque vous utilisez des valeurs de date et d' heure, vous devez convertir les champs en tant que DateTimeet 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))
Bruno Barral
la source
0

Essayez de changer les dates:

2010-09-29 > 2010-01-30?
Jure1873
la source