Frage

In SQL Server 2000 und 2005:

  • Was ist der Unterschied zwischen diesen beiden WHERE Klauseln?
  • , welche sollte ich auf welchen Szenarien verwenden?

Abfrage 1:

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

Abfrage 2:

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

(Edit: die zweite ursprünglich eventdate fehlte, so dass die Abfrage syntaktisch falsch war)

War es hilfreich?

Lösung

Sie sind identisch: BETWEEN eine Abkürzung für die längere Syntax in der Frage.

Verwenden Sie eine Alternative mehr Syntax wo BETWEEN nicht z funktioniert.

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

(Hinweis < statt <= in der zweiten Bedingung.)

Andere Tipps

Sie sind gleich.

Eine Sache, vorsichtig zu sein, ist, wenn Sie diese gegen eine DATETIME- verwenden, wird das Spiel für das Enddatum der Beginn des Tages sein:

<= 20/10/2009

ist nicht das gleiche wie:

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

(es würde Spiel gegen <= 20/10/2009 00:00:00.000)

Obwohl BETWEEN leicht zu lesen und zu pflegen, empfehle ich selten seine Verwendung, da es sich um ein geschlossenes Intervall ist und wie zuvor erwähnt kann dies ein Problem mit Terminen - auch ohne Zeitkomponenten

.

Zum Beispiel, wenn sie mit monatlichen Daten zu tun ist es oft gemeinsame Termine BETWEEN first AND last zu vergleichen, aber in der Praxis ist dies in der Regel einfacher zu schreiben dt >= first AND dt < next-first (die auch die Zeit Teil Problem löst) - da die Bestimmung last in der Regel einen Schritt länger als die Bestimmung next-first (durch einen Tag subtrahieren).

Darüber hinaus ein weiterer gotcha ist, dass untere und obere Grenze festgelegt werden muß in der richtigen Reihenfolge (d.h. BETWEEN low AND high).

Normalerweise gibt es keinen Unterschied - das BETWEEN Schlüsselwort auf allen RDBMS-Plattformen nicht unterstützt wird, aber wenn es ist, sollten die beiden Abfragen identisch sein

.

Da sie identisch sind, dann gibt es wirklich keinen Unterschied in Bezug auf die Geschwindigkeit oder irgendetwas anderes -. Die eine, die Ihnen mehr natürliche scheint

Wie @marc_s erwähnt, @Cloud, et al. sie sind im Grunde das gleiche für einen geschlossenen Bereich.

Aber keine Bruchteilzeitwerte können zu Problemen mit einem geschlossenen Bereich (größer-oder-gleich und weniger oder-gleich ) im Gegensatz zu einem halboffenen Bereich (größer-oder-gleich und weniger als ) mit einem Endwert nach dem letzten möglichen Augenblick.

So zu vermeiden, dass die Abfrage wie folgt umgeschrieben werden:

SELECT EventId, EventName
  FROM EventMaster
 WHERE (EventDate >= '2009-10-15' AND
        EventDate <  '2009-10-19')    /* <<<== 19th, not 18th */

Da BETWEEN funktioniert nicht für die halboffene Intervalle Ich nehme immer einen harten Blick auf ein beliebiges Datum / Zeit-Abfrage, die es verwendet, da es wahrscheinlich ein Fehler.

ich glaube, der einzige Unterschied auf jeder Abfrage die Menge von syntaktischem Zucker. BETWEEN ist nur eine glatte Art und Weise genau zu sagen, das gleiche wie die zweite Abfrage.

Es könnte einigen RDBMS spezifischen Unterschied, dass ich nicht bewusst bin, aber ich glaube nicht wirklich so.

Ich habe eine leichte Präferenz für BETWEEN, weil sie es sofort den Leser klar machen, dass Sie ein Feld für einen Bereich werden überprüft . Dies gilt insbesondere, wenn Sie Ähnliche Feldnamen in der Tabelle haben.

Wenn, sagen wir, unser Tisch hat sowohl eine transactiondate und ein transitiondate, wenn ich lese

transactiondate between ...

Ich weiß sofort, dass beide Ende des Tests sind gegen dieses ein Feld.

Wenn wir lesen

transactiondate>='2009-04-17' and transactiondate<='2009-04-22'

Ich habe einen zusätzlichen Moment nehmen die beiden Felder sind die gleichen, um sicherzustellen.

Auch, wie eine Abfrage im Laufe der Zeit geändert wird, könnte ein schlampig Programmierer die beiden Felder trennen. Ich habe viele Anfragen gesehen, wie etwas sagen

where transactiondate>='2009-04-17'
  and salestype='A'
  and customernumber=customer.idnumber
  and transactiondate<='2009-04-22'

Wenn sie dies mit einem BETWEEN versuchen, natürlich, es wird ein Syntaxfehler und sofort fixiert werden.

Logisch gibt es keinen Unterschied. Performance-weise gibt es -typically, auf den meisten DBMSes- keinen Unterschied.

Sehen Sie diese ausgezeichnete Blog-Post von Aaron Bertrand warum Sie Ihre String-Format ändern sollte und wie die Grenzwerte sind in Datumsbereich Anfragen behandelt.

Disclaimer: Alles ist unten nur anekdotisch und direkt aus meiner persönlichen Erfahrung gezogen. Jeder, der eine empirisch rigorose Analyse der Durchführung fühlt up ist willkommen, sie auszuführen und nach unten Abstimmung, wenn ich bin. Ich bin mir auch bewusst, dass SQL eine deklarative Sprache ist und Sie nicht haben, zu prüfen, wie Ihr Code sollten verarbeitet wird, wenn Sie es schreiben, aber, weil ich meine Zeit zu schätzen, das tue ich.

Es gibt unendlich viele logisch äquivalente Aussagen, aber ich werde drei (ish) in Betracht ziehen.

Fall 1: Zwei Vergleiche in einer Standard-Bestellung (Bewertungsreihenfolge festgelegt)

  

A> = MinBound AND A <= MaxBound

Fall 2: Die syntaktische Zucker (Bewertung Reihenfolge nach Autor nicht gewählt wird)

  

A zwischen MinBound UND MaxBound

Fall 3: Zwei Vergleiche in einer gebildeten Reihenfolge (Auswertung, um bei Schreibzeit gewählt)

  

A> = MinBound AND A> = MaxBound

oder

  

A> = MaxBound AND A> = MinBound

Nach meiner Erfahrung Fall 1 und Fall 2 haben keine konsistenten oder bemerkenswerte Unterschiede in der Leistung, wie sie unwissend Dataset sind.

Allerdings Fall 3 kann die Ausführungszeiten erheblich verbessern. Insbesondere wenn Sie mit einem großen Datensatz arbeiten und passieren einige heuristischen Wissen darüber haben, ob A ist eher größer als die MaxBound oder weniger als die < strong> MinBound Sie Ausführungszeiten merklich unter Verwendung von Fall 3 und Bestellung der Vergleiche entsprechend verbessern können.

Ein Anwendungsfall ich habe, ist eine große historische Datensatz mit nicht indizierten Daten für Aufzeichnungen in einem bestimmten Intervall abfragt. Wenn die Abfrage zu schreiben, werde ich eine gute Vorstellung davon, ob oder ob nicht mehr Daten vorhanden ist vor dem angegebenen Intervall oder nach dem angegebenen Intervall und kann meine Vergleiche entsprechend bestellen. Ich habe Ausführungszeiten um mehr als die Hälfte in Abhängigkeit von der Größe des Datensatzes geschnitten hatte, die Komplexität der Abfrage, und die Menge von Datensätzen durch den ersten Vergleich gefiltert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top