他声称,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
Run Code Online (Sandbox Code Playgroud)
请注意,第二个查询中的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
Run Code Online (Sandbox Code Playgroud)
哪个是对的?
注意:这不是试图解决争论或开始火焰战争.我真的想了解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
Run Code Online (Sandbox Code Playgroud)
您在这里比较字符串,而不是日期.
没有什么BETWEEN 12/31/07 and 1/1/08,作为2后进入/中ASCII
| 归档时间: |
|
| 查看次数: |
35562 次 |
| 最近记录: |