Frage SQL: BETWEEN vs <= und> =


In SQL Server 2000 und 2005:

  • Was ist der Unterschied zwischen diesen beiden? WHERE Klauseln?
  • Welchen sollte ich in 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: das zweite Eventdate fehlte ursprünglich, daher war die Abfrage syntaktisch falsch)


84
2017-10-27 11:38


Ursprung


Antworten:


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

Verwenden Sie eine alternative längere Syntax wo BETWEEN funktioniert z. B. nicht

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

(Hinweis < eher, als <= in zweiter Bedingung.)


88
2017-10-27 11:40



Sie sind gleich.

Eine Sache, auf die Sie achten sollten, ist, dass wenn Sie dies für ein DATETIME verwenden, die Übereinstimmung für das Enddatum der Beginn des Tages sein wird:

<= 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)


28
2017-10-27 11:41



Obwohl BETWEEN ist einfach zu lesen und zu pflegen, ich empfehle selten seine Verwendung, weil es ein geschlossenes Intervall ist und wie bereits erwähnt, kann dies ein Problem mit Daten sein - auch ohne Zeitkomponenten.

Wenn Sie beispielsweise mit monatlichen Daten arbeiten, ist es häufig üblich, Daten zu vergleichen BETWEEN first AND last, aber in der Praxis ist das normalerweise einfacher zu schreiben dt >= first AND dt < next-first (was auch das Zeitteil Problem löst) - seit der Bestimmung last ist in der Regel einen Schritt länger als das Bestimmen next-first (durch Subtrahieren eines Tages).

Ein weiteres Problem besteht darin, dass die unteren und oberen Grenzen in der korrekten Reihenfolge (d.h. BETWEEN low AND high).


11
2017-10-27 13:24



In der Regel gibt es keinen Unterschied - die BETWEEN Das Schlüsselwort wird nicht auf allen RDBMS-Plattformen unterstützt, aber wenn dies der Fall ist, sollten die beiden Abfragen identisch sein.

Da sie identisch sind, gibt es wirklich keinen Unterschied in Bezug auf Geschwindigkeit oder irgendetwas anderes - benutze das, was dir natürlicher erscheint.


4
2017-10-27 11:41



Wie von @marc_s, @Cloud, et al. Sie sind im Grunde genommen die gleichen für eine geschlossene Reichweite.

Aber alle Werte für gebrochene Zeit können Probleme 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 der letzte mögliche Zeitpunkt.

Um zu vermeiden, dass die Abfrage wie folgt umgeschrieben wird:

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

Schon seit BETWEEN funktioniert nicht für halboffene Intervalle Ich betrachte immer eine Datums- / Zeitabfrage, die es verwendet, da es wahrscheinlich ein Fehler ist.


4
2017-10-27 11:52



Ich denke, der einzige Unterschied ist die Menge an syntaktischem Zucker bei jeder Abfrage. BETWEEN ist nur eine glatte Art zu sagen genau so wie die zweite Abfrage.

Es könnte einige RDBMS-spezifische Unterschiede geben, die mir nicht bewusst sind, aber ich denke nicht wirklich.


3
2017-10-27 11:41



Logischerweise gibt es keinen Unterschied. Leistungsmäßig gibt es - typischerweise bei den meisten DBMS - keinen Unterschied.


2
2017-10-27 11:42



Sieh dir das an ausgezeichneter Blogbeitrag von Aaron Bertrand Warum sollten Sie das Zeichenfolgenformat und die Behandlung der Randwerte in Datumsbereichsabfragen ändern?


2
2017-10-27 13:06