適用於:SQL Server
Azure SQL 資料庫
Azure SQL 受控執行個體
Azure Synapse Analytics
分析平台系統(PDW)
Microsoft Fabric 中的 SQL 分析端點
Microsoft Fabric 中的倉儲
Microsoft Fabric 中的 SQL 資料庫
指定要測試的範圍。
Syntax
test_expression [ NOT ] BETWEEN begin_expression AND end_expression
Arguments
test_expression
表示式,以在 begin_expression和 end_expression所定義的範圍內測試 。 test_expression 的資料類型必須與 begin_expression 和 end_expression 相同。
NOT
指定述詞的結果已否定。
begin_expression
任何有效的表達式。 begin_expression 的資料類型必須與 test_expression 和 end_expression 相同。
end_expression
任何有效的表達式。 end_expression 的資料類型必須與 test_expression 和 begin_expression 相同。
AND
用來作為預留位置,表示 test_expression 應該位於 begin_expression 和 end_expression 所指定的範圍內。
傳回類型
Boolean
Remarks
如果 BETWEEN 的值大於或等於 TRUE 的值,且小於或等於 end_expression的值, 會傳回 。
如果 NOT BETWEEN 的值小於 TRUE 或大於 end_expression的值, 會傳回 。
若要指定獨佔範圍,請使用大於 (>) 和小於 (<) 運算子。 如果 BETWEEN 或 NOT BETWEEN 述詞的任何輸入 NULL,則結果取決於組成部分的結果。
在下列範例 test_expression >= begin_expression AND test_expression <= end_expression中,如果任一部分 FALSE,則整體 BETWEEN 表示式會評估為 FALSE。 否則,表示式會評估為 UNKNOWN。
Examples
本文中的程式代碼範例會使用 AdventureWorks2025 或 AdventureWorksDW2025 範例資料庫,您可以從 Microsoft SQL Server 範例和社群專案 首頁下載。
A. 使用 BETWEEN
下列範例會傳回資料庫中資料庫角色的相關資訊。 第一個查詢會傳回所有角色。 第二個範例會使用 BETWEEN 子句,將角色限制為指定的 database_id 值。
SELECT principal_id,
name
FROM sys.database_principals
WHERE type = 'R';
結果集如下所示。
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
結果集如下所示。
principal_id name
------------ ----
16385 db_accessadmin
16386 db_securityadmin
16387 db_ddladmin
16389 db_backupoperator
16390 db_datareader
B. 使用 > 和 <,而不是 BETWEEN
下列範例使用大於 (>) 和小於 (<) 運算符,因為這些運算符不包含,因此會傳回九個數據列,而不是前一個範例中傳回的 10 個數據列。
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
結果集如下所示。
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. 使用NOT BETWEEN
下列範例會找出不在指定範圍 27 到 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. 搭配 datetime 值使用 BETWEEN
下列範例會擷取 datetime 值介於 20011212 和 20020105 (含) 之間的資料列。
SELECT BusinessEntityID,
RateChangeDate
FROM HumanResources.EmployeePayHistory
WHERE RateChangeDate BETWEEN '20011212' AND '20020105';
結果集如下所示。
BusinessEntityID RateChangeDate
----------- -----------------------
3 2001-12-12 00:00:00.000
4 2002-01-05 00:00:00.000
查詢會擷取預期的數據列,因為查詢中的日期值和 datetime 儲存在 RateChangeDate 數據行中的值會指定,而不會指定日期的時間部分。 未指定時間部分時,預設為上午 12:00。包含 2002 年 1 月 5 日上午 12:00 之後之時間部分的數據列不會由此查詢傳回,因為它落在範圍之外。