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。
注解
若要指定某个排除范围,请使用大于 (>) 和小于 (<) 运算符。 如果任何 BETWEEN 或 NOT BETWEEN 谓词的输入为 NULL,则结果为 UNKNOWN。
示例
A. 使用 BETWEEN
以下示例返回有关数据库中数据库角色的信息。 第一个查询返回所有角色。 第二个示例使用 BETWEEN
子句将角色限制为指定的 database_id
值。
SELECT principal_id, name
FROM sys.database_principals
WHERE type = 'R';
SELECT principal_id, name
FROM sys.database_principals
WHERE type = 'R'
AND principal_id BETWEEN 16385 AND 16390;
GO
结果集如下。
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
principal_id name
------------ ----
16385 db_accessadmin
16386 db_securityadmin
16387 db_ddladmin
16389 db_backupoperator
16390 db_datareader
B. 使用 > 和 <,而不使用 BETWEEN
下面的示例使用大于 (>
) 和小于 (<
) 运算符,因为这些运算符是非包含的,所以该示例返回九行,而不是像上一个示例那样返回十行。
-- Uses AdventureWorks
SELECT e.FirstName, e.LastName, ep.Rate
FROM HumanResources.vEmployee e
JOIN HumanResources.EmployeePayHistory 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
以外的所有行。
-- Uses AdventureWorks
SELECT e.FirstName, e.LastName, ep.Rate
FROM HumanResources.vEmployee e
JOIN HumanResources.EmployeePayHistory ep
ON e.BusinessEntityID = ep.BusinessEntityID
WHERE ep.Rate NOT BETWEEN 27 AND 30
ORDER BY ep.Rate;
GO
D. 使用带有日期时间值的 BETWEEN
以下示例检索 datetime 值介于 '20011212'
和 '20020105'
(含)之间的行。
-- Uses AdventureWorks
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
列中存储的 datetime 值时未指定日期的时间部分,因此该查询将检索预期行。 当未指定时间部分时,默认为凌晨 12:00。请注意,此查询不会返回包含 2002 年 1 月 5 日凌晨 12:00 之后的时间部分的行,因为它不在此范围之内。
另请参阅
>(大于)(Transact-SQL)
<(小于)(Transact-SQL)
表达式(Transact-SQL)
内置函数 (Transact-SQL)
运算符 (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)