适用于: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 指定的范围内。
Return types
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
本文中的代码示例使用 AdventureWorks2022
或 AdventureWorksDW2022
示例数据库,可以从 Microsoft SQL Server 示例和社区项目 主页下载该数据库。
A. Use 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 之后的时间部分的行不会由此查询返回,因为它超出范围。