w tym filmie opowiemy Ci, jak używać operatora SQL BETWEEN; pokażemy, dlaczego chcesz używać operatora BETWEEN i jak uniknąć pułapek podczas używania go z typem DATETIME.
Operator BETWEEN jest równoważny użyciu i kombinacji>= I<= operatorów porównania, ale sprawia, że bardziej kompaktowe porównanie zakresu. Po zapoznaniu się z tym artykułem, polecam obejrzenie naszej następnej niezbędnej minuty SQL, aby kontynuować naukę więcej o SQL Server!
Po obejrzeniu filmu sprawdź przykładowy kod poniżej. Zamieściłem też transkrypcję do wykorzystania.
to jest minuta SQL na operatorze BETWEEN!
Zapraszamy na kolejną niezbędną minutę SQL. W tym odcinku dowiemy się, jak używać operatora BETWEEN do porównywania zakresu wartości w zapytaniach SQL server.
Operator BETWEEN służy do porównywania zakresu wartości. Oto przykład, w którym używam go do porównania zakresu wartości, które są większe lub równe 12 i mniejsze lub równe 28. Kiedy korzystam z operatora BETWEEN, jest on włączony.
będzie zawierać liczby, które porównujemy pomiędzy nimi. Powszechną formą użycia BETWEEN w klauzuli WHERE jest określenie pola, więc w tym przypadku jest to „IsoNumericCode”, czyli pole. Następnie pomiędzy operatorami; mówimy, że chcemy, aby „Kod Izonumeryczny” był pomiędzy, a następnie zakresem. Więc chcemy, żeby to było między 12 a 28.
możesz się zastanawiać, jak to będzie wyglądać w staroświecki sposób, używając większego i równego oraz mniejszego i równego. Tak by to wyglądało. Gdybyśmy zrobili to samo używając większego i równego oraz mniejszego i równego, mielibyśmy gdzie IsoNumericCode >=12 i IsoNumericCode < = 28.
w porządku, więc chodźmy zobaczyć, jak to wygląda w SQL server. Mam nasze zapytanie załadowane w SQL server. Widać tutaj, że będziemy szukać kodu Izonumerycznego między 12 a 28, jest on w tej samej linii, zazwyczaj tak by to było napisane.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode BETWEEN 12 and 28
pozwól, że to uruchomię i podniosę to trochę tutaj. Możesz zobaczyć, że zakres powracających wartości wynosi od 12 do 28. Gdybym miał zwiększyć to powiedzmy do 100, spodziewałbym się powrotu kolejnych wierszy. Widać, że idą aż do 100.
ostrzegam, że kolejność ma znaczenie. Jeśli zrobiłem między 100 a 12, nie dostanę żadnych wyników.
ponieważ, jeśli się nad tym zastanowić, chodzi o to, że chcę, aby kody liczbowe były pomiędzy … chcę, aby były większe lub równe 100 i mniejsze lub równe 12. Nie ma nic pomiędzy tym. Więc to wina, że nic nie wraca. Więc kolejność ma znaczenie, i ważne jest, że masz go tak, że za pomocą operatora BETWEEN, najniższa liczba jest pierwsza. Wróćmy do 12 i 28.
kolejną rzeczą, którą mogę zrobić, jest użycie operatora NOT with BETWEEN. Więc jeśli powiem „nie między 12 a 28”, to zwróćmy każdy wiersz w tabeli krajów, który nie ma kodu liczbowego, który jest większy lub równy 12 i mniejszy lub równy 28.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode NOT BETWEEN 12 and 28
tak więc zasadniczo te cztery wiersze byłyby wycięte z tego wyniku. Sprawdźmy to. Teraz widać, że dostaję 186 wierszy.
gdybym po prostu zrobił zapytanie wprost bez żadnych ograniczeń na to, zobaczysz, że dostaję 190 wierszy z powrotem. To pokazuje wam, że te cztery rzędy zostały wyrzeźbione. W rzeczywistości, jeśli chcesz zrobić kolejny test mogę po prostu powiedzieć lub IsoNumericCode między 12 a 28 i to przywróci wszystko.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode NOT BETWEEN 12 and 28 OR IsoNumericCode BETWEEN 12 and 28
więc przywraca to 190 wierszy. Naprawdę, to jest trochę bezsensowne w tym sensie, że przywraca wszystkie rzędy.
wszystkie nasze przykłady do tej pory pracowały z liczbą całkowitą. Ale BETWEEN działa z wieloma innymi typami danych. Moglibyśmy również użyć go do typów danych znakowych (VARCHAR) i działałoby to w ten sam sposób tak długo, jak mamy ustawione rozkazy sortowania, wszystko działa dobrze.
jednym z typów danych, na który uważam, że należy uważać, jest typ danych „DateTime”.
ponieważ w typie danych DateTime zobaczysz, że w dacie jest składnik czasu, a jeśli po prostu zrobimy między używaniem tylko dnia, a nie Godziny, Data i czas będą domyślnie o północy. To naprawdę nie jest uzyskanie wszystkich wyników myślisz, że byłoby. Myślę, że najlepszym sposobem na to jest pokazanie ci, co mam na myśli.
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');
podam przykład, w którym będziemy deklarować tabelę, a w tej tabeli będziemy wyciągać daty od 1 do 3 lutego. Kiedy to sprawdzę, zobaczysz, że odzyskam pięć rzędów.
zauważ, jak tam są czasy, prawda? Jeśli nie podam daty, To wraca z datą zaczynającą się o północy. Jak na razie dobrze.
wielkie pytanie brzmiałoby więc co się wtedy stanie przy kolejnym zapytaniu, jeśli przywrócę „ModifyDate” między 1 A 3?
gdybym powiedział to po angielsku, spodziewałbym się, że wszystkie pięć z nich wróci. Ale teraz powiem, że nie wszystkie pięć powróci, ponieważ ten tutaj, który ma na sobie trzecią, kiedy zostanie zamieniony na DateTime, będzie miał czas północy. Więc spadnie ten piąty rząd. Pokażę Ci, co mam na myśli.
SELECT Name, ModifyDateFROM @myTableWHERE ModifyDate BETWEEN '2017-02-01' AND '2017-02-03'ORDER BY ModifyDate
jak widać, teraz w zasadzie sprowadza tylko cztery wiersze, ponieważ szukamy zasadniczo dat i godzin, które są między północą 1st a mniej więcej północą 3rd.
jednym ze sposobów obejścia tego jest wprowadzenie czasu tuż przed północą. Przejdę do sekund. Więc teraz, kiedy to uruchomię, zobaczysz, że dostaję pięć wierszy, ponieważ to będzie” 11:59: 59 ” sekund.
SELECT Name, ModifyDateFROM @myTableWHERE ModifyDate BETWEEN '2017-02-01' AND '2017-02-03 23:59:59'ORDER BY ModifyDate
nie liczę setek sekund itd. Szczerze mówiąc, czuję, że to trochę brudne. Czuję, że jeśli naprawdę chcesz używać między z datami w tym przypadku, i chciałeś uzyskać każdą datę możliwą z czasem od 3rd, najlepszym sposobem, aby to zrobić, jest po prostu użyć 4th.
SELECT Name, ModifyDate
FROM @myTable
WHERE ModifyDate BETWEEN '2017-02-01′ AND '2017-02-04′
ORDER BY ModifyDate
w tym przypadku, BETWEEN with DateTime niekoniecznie używa tego samego zachowania, co w przypadku liczb całkowitych, ponieważ mimo, że jest inkluzywny, to dojdzie do północy, która jest właśnie tą nanosekundą po trzeciej. Wygląda zabawnie. Kiedy to uruchomię, zobaczysz, że wyciąga tę datę z drugiej części trzeciego.
więc jest to funkcja z BETWEEN i DateTime. Wiem, że wielu ludzi unikało daty i godziny, a oni używali „greater than” I „less than”.
więc nasuwa się pytanie; dlaczego mielibyście używać BETWEEN?
myślę, że są dwa powody, dla których chciałbyś użyć BETWEEN. Pierwszym jest czytelność. Drugim jest konserwacja.
dla czytelności, chodzi mi o to, że gdybym miał powiedzieć, że ” ModifyDate „jest większe i równe 1., A” ModifyDate ” jest mniejsze niż równe 4., w bardzo długim zapytaniu może to być trudne do odczytania, ponieważ jest wiele wyrażeń do przeanalizowania, a logika logiczna może mi przeszkodzić. W tym sensie, BETWEEN może wydawać się trochę bardziej naturalne do czytania. Ryzykując niezrozumienie tego, co faktycznie robi, jak wyjaśniliśmy w DateTime.
również, z punktu widzenia konserwacji, jeśli chcę wejść i muszę zmienić „ModifyDate” na, Wiem, że mogę tu wejść i muszę to zmienić w dwóch miejscach. Musiałbym zmienić pierwszą część terminu i drugą część, hipotetycznie. Gdzie, Jeśli używam tylko BETWEEN, muszę to zmienić tylko w jednym miejscu.
Jeśli chcesz poznać moje zdanie na temat tego, czy używasz BETWEEN czy greater than czy less than, ja osobiście używam greater than czy less than, ponieważ wtedy wiem, jakie działania są faktycznie podejmowane. Czuję, że mam trochę wyraźniejszy głos w tym, co się dzieje, a to sprawia, że czuję się lepiej. Nie muszę się martwić: „czy to naprawdę działa? Czy to ma być randka przed północą?”Wszystkie tego rodzaju założenia wychodzą przez okno. Lubię pracować tam, gdzie nie ma żadnych założeń w komputerach, to tylko sprawia, że czuję się bardziej szczęśliwy. Ja osobiście nie używam BETWEEN. Ale jeśli ci się podoba, myślę, że jest świetny w użyciu. Jest obsługiwany w wielu różnych dialektach SQL, i mówię, idź na to. Jeszcze raz dziękuję, miłego dnia.