BETWEEN (Transact-SQL)
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
punkt końcowy analizy SQL w usłudze Microsoft Fabric
Warehouse w usłudze Microsoft Fabric
SQL Database w usłudze Microsoft Fabric
Określa zakres do przetestowania.
Transact-SQL konwencje składni
Składnia
test_expression [ NOT ] BETWEEN begin_expression AND end_expression
Argumenty
test_expression
Wyrażenie do testowania w zakresie zdefiniowanym przez begin_expressioni end_expression. test_expression musi być tym samym typem danych co zarówno begin_expression, jak i end_expression.
NIE
Określa, że wynik predykatu jest negowany.
begin_expression
Dowolne prawidłowe wyrażenie. begin_expression musi być tym samym typem danych co zarówno test_expression, jak i end_expression.
end_expression
Dowolne prawidłowe wyrażenie. end_expression musi być tym samym typem danych co zarówno test_expression, jak i begin_expression.
I
Działa jako symbol zastępczy, który wskazuje, test_expression powinien znajdować się w zakresie wskazywanym przez begin_expression i end_expression.
Typy zwracane
logiczne
Uwagi
BETWEEN
zwraca TRUE
, jeśli wartość test_expression jest większa lub równa wartości begin_expression i mniejszej lub równej wartości end_expression.
NOT BETWEEN
zwraca wartość TRUE
, jeśli wartość test_expression jest mniejsza niż wartość begin_expression lub większa niż wartość end_expression.
Aby określić zakres wyłączny, użyj większego niż (>
) i mniejszego niż operatory (<
). Jeśli jakiekolwiek dane wejściowe do predykatu BETWEEN
lub NOT BETWEEN
są NULL
, wynik zależy od wyników części składowych.
W poniższym przykładzie test_expression >= begin_expression AND test_expression <= end_expression
, jeśli którakolwiek część jest FALSE
, ogólne wyrażenie BETWEEN
daje FALSE
. W przeciwnym razie wyrażenie oblicza wartość UNKNOWN
.
Przykłady
Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2022
lub AdventureWorksDW2022
, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.
A. Używanie funkcji BETWEEN
Poniższy przykład zwraca informacje o rolach bazy danych w bazie danych. Pierwsze zapytanie zwraca wszystkie role. W drugim przykładzie użyto klauzuli BETWEEN
, aby ograniczyć role do określonych wartości database_id
.
SELECT principal_id,
name
FROM sys.database_principals
WHERE type = 'R';
Oto zestaw wyników.
principal_id name
------------ ----
0 public
16384 db_owner
16385 db_accessadmin
16386 db_securityadmin
16387 db_ddladmin
16389 db_backupoperator
16390 db_datareader
16391 db_datawriter
16392 db_denydatareader
16393 db_denydatawriter
SELECT principal_id,
name
FROM sys.database_principals
WHERE type = 'R'
AND principal_id BETWEEN 16385 AND 16390;
GO
Oto zestaw wyników.
principal_id name
------------ ----
16385 db_accessadmin
16386 db_securityadmin
16387 db_ddladmin
16389 db_backupoperator
16390 db_datareader
B. Użyj >
i <
zamiast między
W poniższym przykładzie użyto operatorów większej niż (>
) i mniejszej niż (<
), a ponieważ te operatory nie są włącznie, zwraca dziewięć wierszy zamiast 10, które zostały zwrócone w poprzednim przykładzie.
SELECT e.FirstName,
e.LastName,
ep.Rate
FROM HumanResources.vEmployee AS e
INNER JOIN HumanResources.EmployeePayHistory AS ep
ON e.BusinessEntityID = ep.BusinessEntityID
WHERE ep.Rate > 27
AND ep.Rate < 30
ORDER BY ep.Rate;
GO
Oto zestaw wyników.
FirstName LastName Rate
--------- ------------------- ---------
Paula Barreto de Mattos 27.1394
Janaina Bueno 27.4038
Dan Bacon 27.4038
Ramesh Meyyappan 27.4038
Karen Berg 27.4038
David Bradley 28.7500
Hazem Abolrous 28.8462
Ovidiu Cracium 28.8462
Rob Walters 29.8462
C. Użyj NOT BETWEEN
W poniższym przykładzie wszystkie wiersze znajdują się poza określonym zakresem 27
za pośrednictwem 30
.
SELECT e.FirstName,
e.LastName,
ep.Rate
FROM HumanResources.vEmployee AS e
INNER JOIN HumanResources.EmployeePayHistory AS ep
ON e.BusinessEntityID = ep.BusinessEntityID
WHERE ep.Rate NOT BETWEEN 27 AND 30
ORDER BY ep.Rate;
GO
D. Używanie funkcji BETWEEN z wartościami daty/godziny
Poniższy przykład pobiera wiersze, w których wartości data/godzina znajdują się między 20011212
a 20020105
włącznie.
SELECT BusinessEntityID,
RateChangeDate
FROM HumanResources.EmployeePayHistory
WHERE RateChangeDate BETWEEN '20011212' AND '20020105';
Oto zestaw wyników.
BusinessEntityID RateChangeDate
----------- -----------------------
3 2001-12-12 00:00:00.000
4 2002-01-05 00:00:00.000
Zapytanie pobiera oczekiwane wiersze, ponieważ wartości daty w zapytaniu i wartości daty/godziny przechowywane w kolumnie RateChangeDate
są określane bez części godziny daty. Gdy część czasowa jest nieokreślona, wartość domyślna to 12:00. Wiersz zawierający część czasową, która znajduje się po godzinie 12:00 w dniu 5 stycznia 2002 r., nie jest zwracana przez to zapytanie, ponieważ znajduje się poza zakresem.