In diesem Video erfahren Sie, wie Sie den SQL BETWEEN-Operator verwenden. Wir zeigen Ihnen, warum Sie den BETWEEN-Operator verwenden möchten und wie Sie Fallstricke vermeiden, wenn Sie ihn mit dem DATETIME-Typ verwenden.
Der BETWEEN-Operator entspricht der Verwendung UND Kombination von >= und <= Vergleichsoperatoren, ermöglicht jedoch einen kompakteren Bereichsvergleich. Sobald Sie diesen Artikel durchgesehen haben, würde ich empfehlen, unsere nächste Essential SQL Minute anzusehen, um mehr über SQL Server zu erfahren!
Wenn Sie das Video gesehen haben, schauen Sie sich den Beispielcode unten an. Ich habe auch ein Transkript für Sie zu verwenden.
Dies ist eine SQL-Anweisung für den BETWEEN-Operator!
Willkommen zu einer weiteren wichtigen SQL-Minute. In dieser Episode erfahren Sie, wie Sie mit dem Operator BETWEEN einen Wertebereich in SQL Server-Abfragen vergleichen.
Der BETWEEN-Operator wird verwendet, um einen Wertebereich zu vergleichen. Hier ist ein Beispiel, in dem ich es verwende, um einen Bereich von Werten zu vergleichen, die größer oder gleich 12 und kleiner oder gleich 28 sind. Wenn ich den BETWEEN Operator verwende, ist er inklusive.
Es enthält die Zahlen, die wir dazwischen vergleichen. Die übliche Form für die Verwendung von BETWEEN in der WHERE Klausel ist die Angabe des Feldes, in diesem Fall ist es also „IsoNumericCode“, das ist das Feld. Dann die BETWEEN-Operatoren; Wir sagen, wir möchten, dass der „IsoNumericCode“ ZWISCHEN und dann dem Bereich liegt. Also wollen wir, dass es zwischen 12 und 28 ist.
Sie fragen sich vielleicht, wie dies auf die altmodische Weise mit größer als und gleich und kleiner als und gleich aussehen würde. So würde es aussehen. Wenn wir dasselbe mit größer als und gleich und kleiner als und gleich tun würden, hätten wir where IsoNumericCode >=12 UND IsoNumericCode <= 28 .
In Ordnung, also lasst uns sehen, wie das in SQL Server aussieht. Ich habe unsere Abfrage in SQL Server geladen. Sie können hier sehen, dass wir nach dem IsoNumericCode ZWISCHEN 12 und 28 suchen werden, er befindet sich in derselben Zeile.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode BETWEEN 12 and 28
Lassen Sie mich das ausführen und dies hier ein wenig ansprechen. Sie können sehen, dass der Bereich der zurückgegebenen Werte zwischen 12 und 28 liegt. Wenn ich dies auf 100 erhöhen würde, würde ich erwarten, dass mehr Zeilen zurückkommen. Sie können sehen, dass sie den ganzen Weg bis zu 100 gehen.
Nun möchte ich Sie warnen, dass die Reihenfolge eine Rolle spielt. Wenn ich ZWISCHEN 100 und 12 mache, bekomme ich keine Ergebnisse.
Denn wenn Sie darüber nachdenken, was das bedeutet, möchte ich, dass die numerischen Codes zwischen … ich möchte, dass sie größer oder gleich 100 und kleiner oder gleich 12 sind. Da ist nichts dazwischen. Es ist also ein Fehler, nichts kommt zurück. Die Reihenfolge ist also wichtig, und es ist wichtig, dass Sie sie haben, damit mit dem BETWEEN Operator die niedrigste Zahl zuerst steht. Okay, gehen wir zurück zu 12 und 28.
Eine andere Sache, die ich tun kann, ist NOT operator with BETWEEN . Wenn ich also „NICHT ZWISCHEN 12 und 28“ sage, sage ich wirklich, dass wir jede Zeile in der Ländertabelle zurückbringen, die keinen numerischen Code hat, der größer oder gleich 12 und kleiner oder gleich 28 ist.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode NOT BETWEEN 12 and 28
Diese vier Zeilen würden also im Wesentlichen aus diesem Ergebnis herausgeschnitten. Lass uns das machen. Sie können jetzt sehen, dass ich 186 Zeilen bekomme.
Wenn ich die Abfrage nur ohne Einschränkungen durchgeführt habe, werden Sie sehen, dass ich 190 Zeilen zurückbekomme. Dies dient also dazu, Ihnen zu zeigen, dass diese vier Reihen tatsächlich herausgeschnitten wurden. In der Tat, wenn Sie einen anderen Test machen wollen, könnte ich einfach sagen ODER IsoNumericCode ZWISCHEN 12 und 28 und das würde alles zurückbringen.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode NOT BETWEEN 12 and 28 OR IsoNumericCode BETWEEN 12 and 28
Das bringt also 190 Zeilen zurück. Wirklich, das ist irgendwie unsinnig in dem Sinne, dass es alle Zeilen zurückbringt.
Alle unsere Beispiele haben bisher mit der Ganzzahl gearbeitet. Aber es funktioniert mit vielen anderen Datentypen. Wir könnten es auch für Zeichendatentypen (VARCHAR) verwenden, und es würde genauso funktionieren, solange wir die Sortierreihenfolgen festgelegt haben.
Ein Datentyp, mit dem Sie meiner Meinung nach vorsichtig sein müssen, ist der Datentyp „DateTime“.
Da im Datentyp DateTime Sie sehen, dass das Datum eine Zeitkomponente enthält, und wenn wir nur einen TAG und nicht die Uhrzeit verwenden, sind Datum und Uhrzeit standardmäßig Mitternacht. Es ist wirklich nicht immer alle Ergebnisse, die Sie denken, es würde. Ich denke, der beste Weg, dies zu tun, ist, Ihnen zu zeigen, was ich meine.
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');
Ich werde ein Beispiel bringen, in dem wir eine Tabelle deklarieren werden, und in dieser Tabelle werden wir Daten vom 1. bis 3. Februar abrufen. Wenn ich das ausführe, wirst du sehen, dass ich fünf Zeilen zurückbekomme.
Beachten Sie, wie oft diese angezeigt werden, oder? Wenn ich an einem Datum keine Uhrzeit angebe, wird ein Datum angezeigt, das um Mitternacht beginnt. So weit, so gut.
Die große Frage wäre also, was wird dann bei einer anderen Abfrage hier passieren, wenn ich „ModifyDate“ ZWISCHEN dem 1. und dem 3. zurückbringe?
Wenn ich das auf Englisch sage, würde ich erwarten, dass alle fünf wiederkommen. Aber ich werde jetzt sagen, dass nicht alle fünf zurückkommen werden, denn dieser hier, der den 3. drauf hat, wenn er in die DateTime konvertiert wird, wird er tatsächlich eine Zeit von Mitternacht haben. Also wird es diese 5. Reihe fallen lassen. Lassen Sie mich Ihnen zeigen, was ich hier meine.
SELECT Name, ModifyDateFROM @myTableWHERE ModifyDate BETWEEN '2017-02-01' AND '2017-02-03'ORDER BY ModifyDate
Wie Sie sehen können, bringt es jetzt im Grunde nur vier Zeilen zurück, weil wir im Wesentlichen nach Daten und Zeiten suchen, die zwischen Mitternacht des 1. und ungefähr Mitternacht des 3. liegen.
Eine Möglichkeit, dies zu umgehen, besteht darin, die Zeit kurz vor Mitternacht einzugeben. Also nur um … ich gehe hier zu den Sekunden. Wenn ich das jetzt ausführe, wirst du sehen, dass ich fünf Zeilen bekomme, weil es „11:59:59“ Sekunden wird.
SELECT Name, ModifyDateFROM @myTableWHERE ModifyDate BETWEEN '2017-02-01' AND '2017-02-03 23:59:59'ORDER BY ModifyDate
Ich zähle nicht die Hunderte von Sekunden und so weiter. Um ehrlich zu sein, ich fühle, dass das irgendwie chaotisch ist. Ich denke, wenn Sie in diesem Fall wirklich BETWEEN with dates verwenden möchten und jedes mögliche Datum mit seiner Zeit ab dem 3. erhalten möchten, ist der beste Weg, dies zu tun, nur das 4. zu verwenden.
SELECT Name, ModifyDate
FROM @myTable
WHERE ModifyDate BETWEEN ‚2017-02-01‘ AND ‚2017-02-04‘
ORDER BY ModifyDate
In diesem Fall verwendet BETWEEN with DateTime nicht unbedingt das gleiche Verhalten wie bei Ganzzahlen, denn obwohl es inklusive ist, wird es bis Mitternacht dauern, was genau die Nanosekunde nach dem 3. ist. Es sieht einfach lustig aus. Wenn ich das starte, werden Sie sehen, dass es dieses Datum aus dem letzten Teil des 3. zieht.
Das ist also ein Gotcha mit BETWEEN und DateTime . Ich weiß also, dass viele Leute zwischen Datumsangaben und Uhrzeit wechseln, und sie verwenden nur größer als und kleiner als.
Es stellt sich also die Frage; Warum würden Sie BETWEEN ?
Ich denke, es gibt zwei Gründe, warum Sie BETWEEN verwenden möchten. Das erste ist die Lesbarkeit. Die zweite ist die Wartbarkeit.
Aus Gründen der Lesbarkeit meine ich, wenn ich sagen müsste, dass „ModifyDate“ größer und gleich dem 1. ist und „ModifyDate“ kleiner als gleich dem 4. ist, kann dies in einer sehr langen Abfrage schwer zu lesen sein, da viele Ausdrücke analysiert werden müssen und die Boolesche Logik mir möglicherweise im Weg steht. In diesem Sinne erscheint es vielleicht etwas natürlicher zu lesen. Auf die Gefahr eines Missverständnisses, was es tatsächlich tut, wie wir mit DateTime erklärt haben.
Aus Sicht der Wartbarkeit weiß ich auch, dass ich hier reinkommen kann und es an zwei Stellen ändern muss, wenn ich einsteigen möchte und wie „ModifyDate“ ändern muss. Ich müsste den ersten Teil des Begriffs und den zweiten Teil hypothetisch ändern. Wenn ich nur BETWEEN , muss ich es nur an einer Stelle ändern.
Wenn Sie wissen möchten, ob Sie BETWEEN oder greater than oder less than verwenden würden, verwende ich persönlich greater than oder less than , weil ich dann weiß, welche Maßnahmen tatsächlich ergriffen werden. Ich habe das Gefühl, dass ich ein bisschen expliziter sagen kann, was los ist, und das macht mich besser. Ich muss mir keine Sorgen machen: „Funktioniert das wirklich? Ist es das Datum vor Mitternacht nehmen?“ All diese Vermutungen gehen aus dem Fenster. Ich arbeite gerne dort, wo es keine Annahmen in Computern gibt, es macht mich einfach glücklicher. Ich persönlich benutze BETWEEN nicht. Aber wenn es dir gefällt, finde ich es großartig zu benutzen. Es wird in vielen verschiedenen SQL-Dialekten unterstützt, und ich sage, mach es. Nochmals vielen Dank, haben einen guten Tag.