MS SQL Server的“之间”是否包含范围边界?

比如可以

SELECT foo FROM bar WHERE foo BETWEEN 5 AND 10 

select5和10,否则他们被排除在范围之外?

BETWEEN运算符是包含性的。

来自联机丛书:

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

DateTime警告

注意:有了date时间,你必须小心; 如果只给出一个date,那么在当天的午夜时间就是价值; 为了避免在结束date内丢失时间,或者在多个范围内重复在午夜捕获第二天的数据,您的结束date应该在您到目前为止的第二天的午夜之前3毫秒。 3毫秒,因为任何小于这个值,并且值将被取整到第二天的午夜。

例如,为了在2016年6月获得所有的价值,你需要运行:

where myDateTime between '2016-06-01' and dateadd(millisecond, -3, '2016-07-01')

where myDateTime between '2016-06-01 00:00:00.000' and '2016-07-01 23:59:59.997'

是的,但在date之间使用时要小心。

 BETWEEN '01/01/2009' AND '01/31/2009' 

真的被解释为12am,或者

 BETWEEN '01/01/2009 00:00:00' AND '01/31/2009 00:00:00' 

所以会错过1月31日那天发生的事情。 在这种情况下,您将不得不使用:

 myDate >= '01/01/2009 00:00:00' AND myDate < '02/01/2009 00:00:00' --CORRECT! 

要么

 BETWEEN '01/01/2009 00:00:00' AND '01/31/2009 23:59:59' --WRONG! (see update!) 

更新 :完全有可能在一天中的最后一秒创buildlogging,date为01/01/2009 23:59:59.997

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

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

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

来自SQL Server 2008的真实世界的例子。

替代文字

如果你打这个,并不想尝试和处理在代码中添加一天,那么让DB做它..

 myDate >= '01/01/2009 00:00:00' AND myDate < DATEADD(day,1,'01/01/2009 00:00:00') 

BETWEEN (Transact-SQL)

指定要testing的( n )( )范围。

 test_expression [ NOT ] BETWEEN begin_expression AND end_expression 

参数

 test_expression 

expression式是否在由begin_expression和end_expression定义的范围内进行testing。 test_expression必须与begin_expression和end_expression都是相同的数据types。

 NOT 

指定谓词的结果被否定。

 begin_expression 

有任何有效的expression式。 begin_expression必须与test_expression和end_expression都是相同的数据types。

 end_expression 

有任何有效的expression式。 end_expression必须与test_expression和begin_expression都是相同的数据types。

 AND 

充当指示test_expression的占位符应位于由begin_expression和end_expression指示的范围内。

备注

要指定独占范围,请使用大于(>)和小于运算符(<)。 如果BETWEEN或NOT BETWEEN谓词的任何input为NULL,则结果为UNKNOWN。

结果值

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

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

如果列数据types是date时间,那么您可以执行以下操作,以消除date时间和仅在date范围之间进行比较。

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

它包括边界。

 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 

我一直使用这个:

WHERE myDate BETWEEN startDate AND(endDate + 1)