161 votes

SQL : BETWEEN vs <= et >=

Dans SQL Server 2000 et 2005 :

  • quelle est la différence entre les deux WHERE clauses ?
  • lequel je dois utiliser pour quels scénarios ?

Question 1 :

SELECT EventId, EventName
FROM EventMaster
WHERE EventDate BETWEEN '10/15/2009' AND '10/18/2009'

Question 2 :

SELECT EventId, EventName
FROM EventMaster
WHERE EventDate >='10/15/2009'
  AND EventDate <='10/18/2009'

(Edit : le deuxième Eventdate manquait à l'origine, donc la requête était syntaxiquement incorrecte)

2 votes

Il s'agit d'un quasi-reproduit avec stackoverflow.com/questions/1572840/sql-between-v1-and-v2

7 votes

Pas vraiment, la gestion des dates est légèrement différente, de plus c'était pour SQL server 2008, et il n'y a aucun moyen pour Shyju d'être certain sans demander que la réponse serait la même pour les versions précédentes.

165voto

Tony Andrews Points 67363

Ils sont identiques : BETWEEN est un raccourci pour la syntaxe plus longue de la question qui inclut les deux valeurs ( EventDate >= '10/15/2009' and EventDate <= '10/19/2009' ).

Utilisez une syntaxe alternative plus longue lorsque BETWEEN ne fonctionne pas parce que l'une ou les deux valeurs ne doivent pas être incluses, par ex.

Select EventId,EventName from EventMaster
where EventDate >= '10/15/2009' and EventDate < '10/19/2009'

(Note < plutôt que <= en seconde condition).

20 votes

Vous devriez peut-être insister sur le fait que la deuxième condition est "<". Il m'a fallu un certain temps pour voir la différence.

27 votes

J'ajouterais que je recommande vivement de ne jamais utiliser BETWEEN à moins que vous ne traitiez le type de données DATE ou que vous ayez garanti d'une autre manière que vos valeurs de date ne comporteront jamais de composante temporelle. En étant cohérent à ce sujet, il est moins probable que vous utilisiez BETWEEN par erreur au lieu de >= et <, et que vous obteniez des données dans la requête alors que vous ne le vouliez pas, ou que vous pensiez obtenir un jour supplémentaire de données alors que ce n'est pas le cas...

2 votes

Y aurait-il une deuxième étape du compilateur lorsque BETWEEN est converti en conditionnel ? Je comprends que c'est un peu pédant mais y aurait-il une surcharge supplémentaire ?

43voto

Irfy Points 866

Ils sont les mêmes.

Une chose à laquelle il faut faire attention, c'est que si vous utilisez cette méthode par rapport à un DATETIME, la correspondance pour la date de fin sera le début de la journée :

<= 20/10/2009

n'est pas la même chose que :

<= 20/10/2009 23:59:59

(il serait match contre <= 20/10/2009 00:00:00.000 )

0 votes

Dans ce cas, vous pouvez simplement utiliser une valeur comprise entre "2009-10-20" et "2009-10-21" pour capturer le jour.

4 votes

@DavidAndreiNed cela correspondrait également à '2009-10-21 00:00:00.000' - ce qui n'est probablement pas ce que vous voulez.

2 votes

Pour être absolument certain, il faut que le champ se situe entre "2009-10-20 00:00:00" et "2009-10-20 23:59:59" ou que le champ >= "2009-10-20 00:00:00" et le champ <= "2009-10-20 23:59:59".

17voto

Cade Roux Points 53870

Bien que BETWEEN est facile à lire et à maintenir, je recommande rarement son utilisation car il s'agit d'un intervalle fermé et, comme mentionné précédemment, cela peut poser un problème avec les dates - même sans composants temporels.

Par exemple, lorsqu'on traite des données mensuelles, il est souvent courant de comparer les dates BETWEEN first AND last mais en pratique, il est généralement plus facile d'écrire dt >= first AND dt < next-first (ce qui résout également le problème de la partie temporelle) - puisque la détermination des last est généralement une étape plus longue que la détermination next-first (en soustrayant un jour).

En outre, une autre difficulté réside dans le fait que les limites inférieures et supérieures doivent être spécifiées dans l'en-tête de l'utilisateur. ordre correct (c'est-à-dire BETWEEN low AND high ).

4voto

marc_s Points 321990

En général, il n'y a pas de différence - le BETWEEN n'est pas pris en charge par toutes les plateformes de SGBDR, mais s'il l'est, les deux requêtes devraient être identiques.

Comme ils sont identiques, il n'y a pas vraiment de différence en termes de vitesse ou autre - utilisez celui qui vous semble le plus naturel.

3voto

sharpcloud Points 4141

Je pense que la seule différence est la quantité de sucre syntaxique sur chaque requête. BETWEEN n'est qu'une façon élégante de dire exactement la même chose que la deuxième requête.

Il existe peut-être une différence spécifique au SGBDR dont je ne suis pas conscient, mais je ne le pense pas vraiment.

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