MS SQL Server's "between"包括范围界限?

例如,可以

SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10

选择5和10,否则它们将被排除在范围之外?

291751 次浏览

BETWEEN操作符是包含的。

来自图书在线:

BETWEEN如果的值为 Test_expression大于或 等于begin_expression的值 小于或等于的值 end_expression . < / p >

DateTime警告

注意:使用DateTimes你必须小心;如果只给出一个日期,则以当天午夜为准;为了避免在结束日期中错过时间,或者在午夜重复多个范围内捕获第二天的数据,您的结束日期应该在您的日期之后的第二天的午夜前3毫秒。3毫秒,因为如果小于这个值,则该值将四舍五入到第二天的午夜。

例如,要在2016年6月内获得所有值,您需要运行:

where myDateTime between '20160601' and DATEADD(millisecond, -3, '20160701')

即。

where myDateTime between '20160601 00:00:00.000' and '20160630 23:59:59.997'

Datetime2和datetimeoffset

从日期中减去3毫秒将使您容易从3毫秒窗口中遗漏行。正确的解决方案也是最简单的:

where myDateTime >= '20160601' AND myDateTime < '20160701'

BETWEEN (Transact-SQL)

指定要测试的(n) (包容)范围。

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 . < / p >

end_expression

是任何有效表达式。End_expression必须是相同的数据 类型为test_expression和 begin_expression . < / p >

AND

作为一个占位符,指示test_expression应该是 在…指示的范围内

. Begin_expression和end_expression

讲话

要指定一个独占范围,使用 大于(>)和小于 操作符(& lt;)。的任何输入 BETWEEN或NOT BETWEEN谓语是

. NULL,结果为UNKNOWN

结果值

BETWEEN如果的值为 Test_expression大于或 等于begin_expression的值 小于或等于的值 end_expression . < / p >

NOT BETWEEN返回TRUE 的值小于 begin_expression或更大的值 > end_expression.

.

.

是的,但是在使用between表示日期时要小心。

BETWEEN '20090101' AND '20090131'

真的被解释为凌晨12点,还是

BETWEEN '20090101 00:00:00' AND '20090131 00:00:00'

所以会错过1月31日当天发生的任何事情。在这种情况下,你必须使用:

myDate >= '20090101 00:00:00' AND myDate < '20090201 00:00:00'  --CORRECT!

BETWEEN '20090101 00:00:00' AND '20090131 23:59:59' --WRONG! (see update!)

更新:完全有可能在一天的最后一秒内创建记录,日期时间晚至20090101 23:59:59.997!!

因此,不建议使用BETWEEN (firstday) AND (lastday 23:59:59)方法。

请使用myDate >= (firstday) AND myDate < (Lastday+1)方法。

关于这个问题的文章在这里

SQL Server 2008的真实例子。

源数据:

ID    Start
1     2010-04-30 00:00:01.000
2     2010-04-02 00:00:00.000
3     2010-05-01 00:00:00.000
4     2010-07-31 00:00:00.000

查询:

SELECT
*
FROM
tbl
WHERE
Start BETWEEN '2010-04-01 00:00:00' AND '2010-05-01 00:00:00'

结果:

ID    Start
1     2010-04-30 00:00:01.000
2     2010-04-02 00:00:00.000

alt text

如果你按了这个,并且真的不想尝试处理在代码中添加一天,那么让DB来做。

myDate >= '20090101 00:00:00' AND myDate < DATEADD(day,1,'20090101 00:00:00')

如果你确实包含了时间部分:确保它指向午夜。否则,你可以简单地省略时间:

myDate >= '20090101' AND myDate < DATEADD(day,1,'20090101')

不用担心。

如果列数据类型为datetime,则可以执行以下操作,从datetime中消除时间,只在日期范围之间进行比较。

where cast(getdate() as date) between cast(loginTime as date) and cast(logoutTime as date)

我一直用这个:

WHERE myDate BETWEEN startDate AND (endDate+1)

它确实包括界限。

declare @startDate date = cast('15-NOV-2016' as date)
declare @endDate date = cast('30-NOV-2016' as date)
create table #test (c1 date)
insert into #test values(cast('15-NOV-2016' as date))
insert into #test values(cast('20-NOV-2016' as date))
insert into #test values(cast('30-NOV-2016' as date))
select * from #test where c1 between @startDate and @endDate
drop table #test
RESULT    c1
2016-11-15
2016-11-20
2016-11-30




declare @r1 int  = 10
declare @r2 int  = 15
create table #test1 (c1 int)
insert into #test1 values(10)
insert into #test1 values(15)
insert into #test1 values(11)
select * from #test1 where c1 between @r1 and @r2
drop table #test1
RESULT c1
10
11
15