Dans cette vidéo, nous vous expliquerons comment utiliser l’opérateur SQL BETWEEN; nous vous montrerons pourquoi vous voudriez utiliser l’opérateur BETWEEN et comment éviter les pièges lors de son utilisation avec le type DATETIME.
L’opérateur BETWEEN est équivalent à l’utilisation et à la combinaison d’opérateurs de comparaison >= et <=, mais permet une comparaison de plage plus compacte. Une fois que vous avez parcouru cet article, je vous recommande de regarder notre prochaine Minute SQL essentielle pour continuer à en savoir plus sur SQL Server!
Une fois que vous avez regardé la vidéo, consultez l’exemple de code ci-dessous. J’ai également inclus une transcription à utiliser.
Ceci est une minute SQL sur l’opérateur BETWEEN !
Bienvenue à une autre minute SQL essentielle. Dans cet épisode, nous allons apprendre à utiliser l’opérateur BETWEEN pour comparer une plage de valeurs dans les requêtes SQL server.
L’opérateur BETWEEN est utilisé pour comparer une plage de valeurs. Voici un exemple où je l’utilise pour comparer une plage de valeurs supérieures ou égales à 12 et inférieures ou égales à 28. Lorsque j’utilise l’opérateur BETWEEN, c’est inclusif.
Il inclura les chiffres que nous comparons entre les deux. Le formulaire commun à utiliser ENTRE dans la clause WHERE est de spécifier le champ, donc dans ce cas c’est « IsoNumericCode », c’est le champ. Ensuite, les opérateurs ENTRE; nous disons que nous voulons que le « IsoNumericCode » soit ENTRE et puis la plage. Nous voulons donc que ce soit entre 12 et 28 ans.
Vous vous demandez peut-être à quoi cela ressemblerait à l’ancienne en utilisant supérieur et égal à et inférieur à et égal à. Voilà à quoi ça ressemblerait. Si nous devions faire la même chose en utilisant supérieur et égal à et inférieur et égal à, nous aurions où IsoNumericCode >=12 ET IsoNumericCode <=28.
D’accord, allons donc voir à quoi cela ressemble dans SQL server. J’ai notre requête chargée dans SQL server. Vous pouvez voir ici que nous allons chercher le code isonumérique ENTRE 12 et 28, c’est sur la même ligne, c’est typiquement comment il serait écrit.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode BETWEEN 12 and 28
Laissez-moi exécuter cela, et évoquez un peu cela ici. Vous pouvez voir que la plage de valeurs qui reviennent va de 12 à 28. Si je devais augmenter cela, disons à 100, je m’attendrais à voir revenir plus de lignes. Vous pouvez voir qu’ils vont jusqu’à 100.
Maintenant, je veux vous avertir que l’ordre compte. Si je faisais ENTRE 100 et 12, je n’obtiendrai aucun résultat.
Parce que, si vous y réfléchissez, ce que cela dit, c’est que je veux que les codes numériques soient compris entre … Je veux qu’ils soient supérieurs ou égaux à 100, et inférieurs ou égaux à 12. Il n’y a rien entre ça. C’est donc une faute que rien ne revient. L’ordre compte donc, et il est important que vous l’ayez pour qu’en utilisant l’opérateur BETWEEN, le nombre le plus bas soit le premier. D’accord, revenons à 12 et 28.
Une autre chose que je peux faire est d’utiliser l’opérateur NOT with BETWEEN. Donc, si je dis « PAS ENTRE 12 et 28 », ce que je dis vraiment, c’est ramenons chaque ligne de la table des pays qui n’a pas de code numérique supérieur ou égal à 12, et inférieur ou égal à 28.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode NOT BETWEEN 12 and 28
Donc essentiellement, ces quatre lignes seraient découpées à partir de ce résultat. Allons-y. Vous pouvez voir maintenant que je reçois 186 lignes.
Si je viens de faire la requête sans aucune restriction, vous verrez que je récupère 190 lignes. Cela sert donc à vous montrer que ces quatre rangées étaient en effet découpées. En fait, si vous voulez faire un autre test, je pourrais simplement dire OU IsoNumericCode ENTRE 12 et 28 et cela ramènerait tout.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode NOT BETWEEN 12 and 28 OR IsoNumericCode BETWEEN 12 and 28
Cela ramène donc 190 lignes. Vraiment, c’est un peu absurde dans le sens où cela ramène toutes les lignes.
Tous nos exemples jusqu’à présent ont fonctionné avec l’entier. Mais ENTRE les travaux avec de nombreux autres types de données. Nous pourrions également l’utiliser pour les types de données de caractères (VARCHAR), et cela fonctionnerait de la même manière tant que nous aurons les ordres de classement définis, tout fonctionnera bien.
Un type de données dont je pense que vous devez faire attention est le type de données ”DateTime ».
Parce que dans le type de données DateTime, vous verrez qu’il y a un composant time dans la date, et si nous faisons simplement UN ENTRE utiliser uniquement le jour et non l’heure, la date et l’heure seront par défaut à minuit. Il n’obtient vraiment pas tous les résultats que vous pensez. Je pense que la meilleure façon de le faire est de vous montrer ce que je veux dire.
DECLARE @myTable TABLE(Name varchar(40), ModifyDate DateTime)INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-01');INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-01 08:23:42');INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-01 14:04:02');INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-03');INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-03 22:32:43');
Je vais apporter un exemple où nous allons déclarer une table, et dans cette table, nous allons extraire les dates du 1er au 3 février. Quand je vais lancer ça, tu vas voir que j’ai cinq rangées en arrière.
Remarquez comment il y a des moments sur ceux-ci, non? Si je ne spécifie pas d’heure à une date, elle revient avec une date commençant à minuit. Jusqu’ici, tout va bien.
La grande question serait donc que va-t-il se passer alors sur une autre requête ici, si je ramène « ModifyDate” ENTRE le 1er et le 3e?
Si je dis cela en anglais, je m’attendrais à ce que tous les cinq reviennent. Mais je vais dire maintenant que tous les cinq ne reviendront pas, parce que celui-ci ici qui a le 3ème dessus, quand il sera converti en DateTime aura en fait une heure de minuit. Donc ça va laisser tomber cette 5e rangée. Laissez-moi vous montrer ce que je veux dire ici.
SELECT Name, ModifyDateFROM @myTableWHERE ModifyDate BETWEEN '2017-02-01' AND '2017-02-03'ORDER BY ModifyDate
Comme vous pouvez le voir, maintenant, il ne ramène que quatre lignes car nous recherchons essentiellement des dates et des heures comprises entre minuit le 1er et environ minuit le 3.
Une façon de contourner ce problème est de mettre l’heure juste avant minuit. Alors juste pour to je vais passer aux secondes ici. Alors maintenant, quand je lance cela, vous verrez que j’ai cinq lignes parce que ça va « 11: 59: 59” secondes.
SELECT Name, ModifyDateFROM @myTableWHERE ModifyDate BETWEEN '2017-02-01' AND '2017-02-03 23:59:59'ORDER BY ModifyDate
Je ne compte pas les centaines de secondes et ainsi de suite. Pour être honnête, je sens que c’est un peu désordonné. Je pense que si vous voulez vraiment utiliser BETWEEN with dates dans ce cas, et que vous vouliez obtenir chaque date possible avec son heure à partir du 3, la meilleure façon de le faire est simplement d’utiliser le 4.
SÉLECTIONNEZ Name, ModifyDate
DE @myTable
OÙ ModifyDate ENTRE ‘2017-02-01’ET ‘2017-02-04’
ORDER BY ModifyDate
Dans ce cas, BETWEEN with DateTime n’utilise pas nécessairement le même comportement que nous le penserions avec des entiers, car bien que ce soit inclusif, cela ira à minuit, ce qui est juste cette nanoseconde après le 3ème. Ça a l’air drôle. Quand je lance ceci, vous verrez qu’il tire cette date de la dernière partie du 3ème.
Donc c’est un gotcha avec ENTRE et DateTime. Donc, je sais que beaucoup de gens évitent en quelque sorte ENTRE les dates et l’heure, et ils utiliseront simplement plus de et moins de.
Cela pose donc la question; pourquoi utiliseriez-vous ENTRE?
Je pense qu’il y a deux raisons pour lesquelles vous voudriez utiliser BETWEEN. Le premier est la lisibilité. La seconde est la maintenabilité.
Pour plus de lisibilité, ce que je veux dire, c’est que si je devais dire que « ModifyDate” est supérieur et égal au 1er, et « ModifyDate” est inférieur au 4e, dans une très longue requête, cela peut devenir difficile à lire car il y a beaucoup d’expressions à commencer à analyser, et la logique booléenne peut me gêner. En ce sens, ENTRE peut sembler un peu plus naturel à lire. Au risque de mal comprendre ce qu’il fait réellement, comme nous l’avons expliqué avec DateTime.
De plus, d’un point de vue de maintenabilité, si je veux entrer et que je dois changer comme « ModifyDate” en, je sais que je peux entrer ici et je dois le changer à deux endroits. Je devrais changer la première partie du terme et la deuxième partie, hypothétiquement. Où si j’utilise juste ENTRE, je n’ai besoin que de le changer à un seul endroit.
Si vous souhaitez savoir si vous utiliseriez ENTRE ou plus ou moins de, j’utilise personnellement plus ou moins de, car alors je sais quelle action est réellement prise. Je sens que j’ai un mot un peu plus explicite sur ce qui se passe, et cela me fait me sentir mieux. Je n’ai pas à m’inquiéter: « Est-ce que ça marche vraiment? Prend-il la date avant minuit? »Tout ce genre de supposition sort par la fenêtre. J’aime travailler là où il n’y a pas d’hypothèses dans les ordinateurs, cela me rend plus heureux. Personnellement, je n’utilise pas ENTRE. Mais si vous l’aimez, je pense que c’est génial à utiliser. Il est pris en charge dans de nombreux dialectes SQL différents, et je dis allez-y. Merci encore, passez une bonne journée.