据cdonner,在他的回答在这里和在他的博客.
他声称,BETWEEN与日期会产生不一致的结果
从他的博客:
select case when '9/1/08' between '9/1/08' and '9/15/08' then 'in' else 'out' end as s1, case when '9/1/08' between '8/28/08' and '9/1/08' then 'in' else 'out' end as s2 s1 s2 ---- ---- in in (1 row(s) affected) select case when '1/1/08' between '1/1/08' and '2/1/08' then 'in' else 'out' end as s1, case when '1/1/08' between '12/31/07' and '1/1/08' then 'in' else 'out' end as s2 s1 s2 ---- ---- in out (1 row(s) affected
请注意,第二个查询中的S2答案在显示日期时应显示"Out".
据cdonner说,原因是因为:
SQL中DateTime类型的最低有效位是3毫秒
我认为原因要简单得多.我认为这是因为他在查询中使用字符串而不是日期.
请原谅我的SQLServer-ish.我主要讲Oracle,所以这可能很难看.但当我接受他的查询 - 证明 - 存在问题并用日期时间变量替换他的字符串时,我得到正确的输出.
DECLARE @Jan108 datetime DECLARE @Feb108 datetime DECLARE @Dec3107 datetime SET @Jan108 = '1/1/08' SET @Feb108 = '2/1/08' SET @Dec3107 = '12/31/07' select case when @Jan108 between @Jan108 and @Feb108 then 'in' else 'out' end as s1, case when @Jan108 between @Dec3107 and @Jan108 then 'in' else 'out' end as s2
哪个是对的?
注意:这不是试图解决争论或开始火焰战争.我真的想了解SQL Server BETWEEN的功能是否低于Oracle BETWEEN.我们在Oracle中没有这样的问题.
在Oracle中:
select case when '1/1/08' between '1/1/08' and '2/1/08' then 'in' else 'out' end as s1, case when '1/1/08' between '12/31/07' and '1/1/08' then 'in' else 'out' end as s2 FROM dual in out
您在这里比较字符串,而不是日期.
没有什么BETWEEN
12/31/07 and 1/1/08
,作为2
后进入/
中ASCII