当前位置:  开发笔记 > 数据库 > 正文

具有日期的BETWEEN实际上是否在SQL SERVER 2008中有效

如何解决《具有日期的BETWEEN实际上是否在SQLSERVER2008中有效》经验,为你挑选了1个好方法。

据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中没有这样的问题.



1> Quassnoi..:

在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

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有