BETWEEN (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics分析平台系统 (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库Microsoft Fabric 预览版中的 SQL 数据库

指定测试范围。

Transact-SQL 语法约定

Syntax

test_expression [ NOT ] BETWEEN begin_expression AND end_expression

Arguments

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 指定的范围内

Return types

Boolean

Remarks

如果 BETWEEN 的值大于或等于 TRUE 的值,并且小于或等于 end_expression的值,则 返回

如果 NOT BETWEEN 的值小于 TRUE 或大于 end_expression的值,则 返回

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

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

Examples

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

下面的示例查找处于指定范围 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 之后的时间部分的行不会由此查询返回,因为它超出范围。