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)