BETWEEN (Transact-SQL)
适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
Analytics Platform System (PDW)
Microsoft Fabric 中的 SQL 终结点
Microsoft Fabric 中的仓库
Microsoft Fabric SQL 数据库
指定测试范围。
语法
test_expression [ NOT ] BETWEEN begin_expression AND end_expression
参数
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 指定的范围内。
返回类型
布尔值
注解
如果 test_expression 的值大于或等于 begin_expression 的值,并且小于或等于 end_expression的值,则 BETWEEN
返回 TRUE
。
如果 test_expression 的值小于 begin_expression 或大于 end_expression的值,则 NOT BETWEEN
返回 TRUE
。
若要指定某个排除范围,请使用大于 (>
) 和小于 (<
) 运算符。 如果 NULL
BETWEEN
或 NOT BETWEEN
谓词的任何输入,则结果取决于构成部分的结果。
在下面的示例 test_expression >= begin_expression AND test_expression <= end_expression
中,如果任一部分 FALSE
,则整个 BETWEEN
表达式的计算结果为 FALSE
。 否则,表达式的计算结果为 UNKNOWN
。
示例
本文中的代码示例使用 AdventureWorks2022
或 AdventureWorksDW2022
示例数据库,可以从 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
以下示例使用大于(>
)和小于(<
)运算符,并且由于这些运算符不包含,因此返回 9 行而不是在上一示例中返回的 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. 将 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
查询检索预期的行,因为查询中的日期值和 日期/时间 存储在 RateChangeDate
列中的值未指定日期部分。 未指定时间部分时,默认为上午 12:00。包含 2002 年 1 月 5 日上午 12:00 之后的时间部分的行不会由此查询返回,因为它超出范围。