Na przykład może
SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10
wybrać 5 i 10 czy są one wykluczone z zakresu?
źródło
Na przykład może
SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10
wybrać 5 i 10 czy są one wykluczone z zakresu?
Operator BETWEEN obejmuje.
Z książek online:
BETWEEN zwraca PRAWDA, jeśli wartość wyrażenia testowego jest większa lub równa wartości wyrażenia początkowego i mniejsza lub równa wartości wyrażenia końcowego.
Zastrzeżenie dotyczące DateTime
NB: Z DateTimes musisz być ostrożny; jeżeli podano tylko datę, wartość przyjmuje się od północy tego dnia; aby uniknąć brakujących czasów w dacie końcowej lub powtarzania przechwytywania danych następnego dnia o północy w wielu zakresach, data końcowa powinna wynosić 3 milisekundy przed północą następnego dnia po dacie. 3 milisekundy, ponieważ mniej niż to, a wartość zostanie zaokrąglona w górę do północy następnego dnia.
np. aby uzyskać wszystkie wartości w czerwcu 2016 r., musisz uruchomić:
where myDateTime between '20160601' and DATEADD(millisecond, -3, '20160701')
to znaczy
where myDateTime between '20160601 00:00:00.000' and '20160630 23:59:59.997'
Odjęcie 3 ms od daty spowoduje, że będziesz narażony na brakujące wiersze w oknie 3 ms. Prawidłowe rozwiązanie jest również najprostsze:
where myDateTime >= '20160601' AND myDateTime < '20160701'
CONVERT
się datetime do daty , jako że odda indeksy bezużyteczne. Użyj standarduWHERE OrderDate >= '20160601' AND OrderDate < '20160701'
. Pamiętaj też, aby użyćyyyymmdd
, ponieważyyyy-mm-dd
jest zależne od ustawień regionalnych i będzie źle interpretowane w zależności od ustawień twojego serweramdy, dmy, ymd, ydm, myd, and dym
.Tak, ale zachowaj ostrożność, używając między datami.
jest naprawdę interpretowane jako 12 rano lub
więc przegapi wszystko, co wydarzyło się w dniu 31 stycznia. W takim przypadku będziesz musiał użyć:
lub
AKTUALIZACJA : Całkowicie możliwe jest utworzenie rekordów w ostatniej sekundzie dnia, z datetime nawet do
20090101 23:59:59.997
!!Z tego powodu
BETWEEN (firstday) AND (lastday 23:59:59)
podejście nie jest zalecane.Użyj
myDate >= (firstday) AND myDate < (Lastday+1)
podejście zamiast.Dobry artykuł na ten temat tutaj .
źródło
WHERE col BETWEEN 'a' AND 'z'
wykluczą na przykład większość wierszy.BETWEEN 5 AND 10
nie obejmuje10.2
...CAST
ingdatetime
jakDATE
to działa:CAST(DATE_TIME_COL AS DATE) BETWEEN '01/01/2009' AND '01/31/2009'
.It is entirely possible to have records created within that last second of the day, with a datetime as late as 01/01/2009 23:59:59.997
<- nie mógłbyś wtedy użyćAND '01/31/2009 23:59:59.99999999'
lub jak wiele 9 jest wymaganychPrzykład świata rzeczywistego z SQL Server 2008.
Dane źródłowe:
Pytanie:
Wyniki:
źródło
ID = 3
wykluczony? JegoStart
wartość jest równaBETWEEN
górnej wartości granicznej iBETWEEN
jest zakresem obejmującym, a nie wyłącznym zakresem górnym.jeśli trafisz w to i tak naprawdę nie chcesz próbować poradzić sobie z dodawaniem dnia w kodzie, pozwól DB to zrobić ...
Jeśli uwzględnisz przedział czasu: upewnij się, że odnosi się on do północy. W przeciwnym razie możesz po prostu pominąć czas:
i nie martw się o to.
źródło
źródło
Jeśli typem danych kolumny jest data / godzina, możesz to zrobić w następujący sposób, aby wyeliminować czas z godziny i porównać tylko zakres dat.
źródło
Obejmuje granice.
źródło
Zawsze używałem tego:
GDZIE moja data MIĘDZY datą początkową ORAZ (data końcowa + 1)
źródło