例如,可以
SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10
选择5和10,否则它们将被排除在范围之外?
例如,可以
SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10
选择5和10,否则它们将被排除在范围之外?
当前回答
如果你按了这个,并且真的不想尝试处理在代码中添加一天,那么让DB来做。
myDate >= '20090101 00:00:00' AND myDate < DATEADD(day,1,'20090101 00:00:00')
如果你确实包含了时间部分:确保它指向午夜。否则,你可以简单地省略时间:
myDate >= '20090101' AND myDate < DATEADD(day,1,'20090101')
不用担心。
其他回答
BETWEEN操作符是包含的。
来自图书在线:
的值,则BETWEEN返回TRUE Test_expression大于或 等于begin_expression的值 小于或等于的值 end_expression。
DateTime警告
注意:使用DateTimes你必须小心;如果只给出一个日期,则以当天午夜为准;为了避免在结束日期中错过时间,或者在午夜重复多个范围内捕获第二天的数据,您的结束日期应该在您的日期之后的第二天的午夜前3毫秒。3毫秒,因为如果小于这个值,则该值将四舍五入到第二天的午夜。
例如,要在2016年6月内获得所有值,您需要运行:
where myDateTime在'20160601'和DATEADD之间(毫秒,-3,'20160701')
i.e.
where myDateTime在'20160601 00:00:00.000'和'20160630 23:59:59.997'之间
日期,日期
从日期中减去3毫秒将使您容易从3毫秒窗口中遗漏行。正确的解决方案也是最简单的:
where myDateTime >= '20160601' AND myDateTime < '20160701'
我一直用这个:
WHERE myDate BETWEEN startDate AND (endDate+1)
如果列数据类型为datetime,则可以执行以下操作,从datetime中消除时间,只在日期范围之间进行比较。
where cast(getdate() as date) between cast(loginTime as date) and cast(logoutTime as date)
如果你按了这个,并且真的不想尝试处理在代码中添加一天,那么让DB来做。
myDate >= '20090101 00:00:00' AND myDate < DATEADD(day,1,'20090101 00:00:00')
如果你确实包含了时间部分:确保它指向午夜。否则,你可以简单地省略时间:
myDate >= '20090101' AND myDate < DATEADD(day,1,'20090101')
不用担心。
它确实包括界限。
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