BETWEEN (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 终结点Microsoft Fabric 中的仓库Microsoft Fabric SQL 数据库

指定测试范围。

Transact-SQL 语法约定

语法

test_expression [ NOT ] BETWEEN begin_expression AND end_expression

参数

test_expression

要测试 begin_expressionend_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

若要指定某个排除范围,请使用大于 (>) 和小于 (<) 运算符。 如果 NULLBETWEENNOT BETWEEN 谓词的任何输入,则结果取决于构成部分的结果。

在下面的示例 test_expression >= begin_expression AND test_expression <= end_expression中,如果任一部分 FALSE,则整个 BETWEEN 表达式的计算结果为 FALSE。 否则,表达式的计算结果为 UNKNOWN

示例

本文中的代码示例使用 AdventureWorks2022AdventureWorksDW2022 示例数据库,可以从 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

下面的示例查找处于指定范围 2730 以外的所有行。

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 之后的时间部分的行不会由此查询返回,因为它超出范围。