167 votes

MySQL « entre » clause pas inclus ?

Si j'exécute une requête avec un between clause, il semble exclure la valeur de fin.
Par exemple:

select * from person where dob between '2011-01-01' and '2011-01-31'

Il obtient tous les résultats avec dob de "2011-01-01' jusqu'à '2011-01-30'; ignorer les enregistrements où dob est '2011-01-31'. Quelqu'un peut-il expliquer pourquoi cette requête se comporte de cette manière, et comment je pourrais modifier pour y inclure les enregistrements où dob est '2011-01-31'? (sans ajouter 1 à la date de la fin parce que sa été choisis par les utilisateurs.) Merci d'avance pour toute aide.

325voto

Frank Heikens Points 29270

Du manuel MySQL :

Ceci est équivalent à l'expression (min <= expr AND expr <= max)

210voto

tiago2014 Points 1502

Le champ dob probablement une composante temporelle.

Pour le tronquer:

 select * from person 
where CAST(dob AS DATE) between '2011-01-01' and '2011-01-31'
 

126voto

Daniel Hilgarth Points 90722

Le problème est que 2011-01-31 est vraiment 2011-01-31 00:00:00. C'est le début de la journée. Tout pendant la journée n'est pas inclus.

33voto

Gaurav Points 14339
select * from person where dob between '2011-01-01 00:00:00' and '2011-01-31 23:59:59'

8voto

JohnFx Points 23761

Est le domaine auquel vous faites référence dans votre question à une Date ou à un DateTime type?

Une cause commune, le comportement que vous décrivez est lorsque vous utilisez un type DateTime où vous devez vraiment être à l'aide d'un type de Date. C'est, à moins que vous vraiment besoin de connaître quelle heure quelqu'un est né, il suffit d'utiliser le type de Date.

La raison pour laquelle le dernier jour n'est pas incluse dans les résultats est de cette manière que la requête est en supposant que le temps de passage de l'dates que vous n'avez pas précisé dans votre requête.

C'est: Votre requête est interprétée comme jusqu'à Minuit entre 2011-01-30 et 2011-01-31, mais les données peuvent avoir une valeur un peu plus tard dans la journée sur 2011-01-31.

Suggestion: Modifiez le champ de type Date, si elle est de type DateTime.

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