2009-10-27 8 views
78

W SQL Server 2000 i 2005:SQL: MIĘDZY vs <= and > =

  • jaka jest różnica między tymi dwoma WHERE klauzul?
  • , którego z nich powinienem użyć w jakich scenariuszach?

Query 1:

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

Query 2:

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

(Edit: druga EVENTDATE pierwotnie brakuje, więc zapytanie było składniowo źle)

+1

To jest quasi duplikat z http://stackoverflow.com/questions/1572840/sql-between-v1-and-v2 – mjv

+4

nie do końca, obsługa datetime jest nieco inna, plus to było dla SQL Server 2008, i nie ma możliwości, aby Shyju był pewien, nie pytając, że odpowiedź będzie taka sama dla poprzednich wersji. – Irfy

Odpowiedz

82

Są identyczne: BETWEEN is skrót do dłuższej składni pytania.

Użyj alternatywnej dłuższej składni, w której BETWEEN nie działa, np.

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

(Uwaga < zamiast <= w drugim stanie).

+14

Może powinieneś podkreślić, że drugim warunkiem jest "<".Zajęło mi trochę czasu, aby zauważyć różnicę. – zendar

+16

Dodam, że zdecydowanie zalecam, aby nigdy nie używać MIĘDZY, chyba że masz do czynienia z typem danych DATE lub w inny sposób zagwarantowałeś, że twoje wartości datetime nigdy nie będą miały składnika czasu. Konsekwentne podejście do tego sprawi, że mniej prawdopodobne będzie użycie POMIĘDZY przez pomyłkę zamiast> = i <, i albo uzyskasz dane w zapytaniu, którego nie chcesz, albo uważasz, że otrzymujesz dodatkowy dzień dane, gdy nie jesteś ... –

+1

Czy istnieje drugi etap kompilacji, gdy BETWEEN zostanie przekonwertowany na warunki warunkowe? Rozumiem, że jest to trochę pedantyczne, ale czy będzie dodatkowe obciążenie? –

4

Zazwyczaj nie ma różnicy - słowo kluczowe BETWEEN nie jest obsługiwane na wszystkich platformach RDBMS, ale jeśli tak, to te dwa pytania powinny być identyczny.

Ponieważ są one identyczne, nie ma naprawdę żadnego rozróżnienia pod względem szybkości ani niczego innego - użyj tego, który wydaje się bardziej naturalny.

3

Myślę, że jedyną różnicą jest ilość cukru syntaktycznego na każde zapytanie. BETWEEN to po prostu sprytny sposób powiedzenia dokładnie tak samo, jak drugie zapytanie.

Może istnieć pewna różnica RDBMS, której nie znam, ale tak naprawdę nie sądzę.

28

Są takie same.

Jedno uważać, to jeśli używasz to na datetime, mecz o dacie zakończenia będzie początkiem dnia:

<= 20/10/2009 

nie jest taki sam jak:

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

(to by mecz przeciwko <= 20/10/2009 00:00:00.000)

+0

W tym przypadku można po prostu użyć między "2009-10-20" i "2009-10-21", aby uchwycić dzień –

+3

@DavidAndreiNed, który również pasowałby do "2009-10-21 00: 00: 00.000" - prawdopodobnie nie tego, co chcesz. –

2

Logicznie nie ma różnicy w ogóle. Pod względem wydajności istnieją - typowo, w większości systemów DBMS - nie ma żadnej różnicy.

4

Jak wspomniano w @marc_s, @Cloud, et al. w zasadzie są one takie same dla zamkniętego zasięgu.

Ale wszelkie wartości czasu ułamkowe mogą powodować problemy z zamkniętym przedziale (większy lub równy i mniejszy lub równy), w przeciwieństwie do półotwartej zakresu (większy lub równy i mniej niż) o wartości końcowej po w ostatniej możliwej chwili.

Tak, aby uniknąć że zapytanie powinno być zapisane jako:

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

Od BETWEEN nie działa na półotwartych przedziałów zawsze podjąć twarde spojrzenie na każde zapytanie data/czas, który go używa, ponieważ prawdopodobnie jest to błąd.

2

Mam niewielką preferencję dla BETWEEN, ponieważ natychmiast informuje czytelnika, że ​​sprawdzasz jedno pole dla zakresu. Jest to szczególnie ważne, jeśli masz podobne nazwy pól w tabeli.

Jeśli, powiedzmy, nasza tabela ma zarówno transactiondate i transitiondate, jeśli czytam

transactiondate between ... 

wiem od razu, że oba końce testu są przeciwko tej jednej dziedzinie.

Jeśli czytam

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

muszę wziąć dodatkowy moment, aby upewnić się, że te dwa pola są takie same.

Ponadto, w miarę edytowania zapytania w czasie, niechlujny programista może oddzielić dwa pola. Widziałem mnóstwo zapytań, które mówią coś takiego

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

Gdyby spróbować tego z BETWEEN, oczywiście, będzie to błąd składni i szybko naprawione.

11

Chociaż BETWEEN jest łatwy do odczytania i utrzymywania, rzadko polecam jego używanie, ponieważ jest to przedział zamknięty i jak wspomniano wcześniej, może to być problem z datami - nawet bez komponentów czasowych.

Na przykład, gdy mamy do czynienia z danych miesięcznych jest często wspólna dla porównania dat BETWEEN first AND last, ale w praktyce jest to zazwyczaj łatwiej napisać dt >= first AND dt < next-first (który rozwiązuje również część problemu time) - od określenia last zazwyczaj jest jeden krok dłużej niż określanie next-first (odejmując jeden dzień).

Ponadto innym problemem jest to, że dolna i górna granica muszą być określone w poprawnej kolejności (tj. BETWEEN low AND high).

+0

@DavidAndreiNed Źle. Nie rozpowszechniaj tego. – Atys