SQL Server 2012 - Where子句中的Case语句

3

我不太擅长SQL,但我无法弄清楚为什么这不起作用。我只想根据一个值运行不同的 AND 语句。具体来说,如果 foo = 0,则想要更改 dateDiff 函数中的 datePart。

SELECT foo,
       bar,
       test
FROM table
WHERE bar = 1,
CASE WHEN foo = 0
        AND dateDiff(dd, getDate(), 2 ) < test
ELSE
        AND dateDiff(hh, getDate(), 2 ) < test
END

您的查询语句存在语法错误。 - Andrey Gordeev
我不知道为什么,但这是SQL中人们经常犯的一个错误——他们引入了一个CASE表达式,而实际上,他们真正需要的只是基本的逻辑运算符。 - Damien_The_Unbeliever
达米安,能否详细说明一下? - Jason Wells
2
就像Devart的回答中所说,你只需要写(foo = 0 AND DATEDIFF(dd,...) OR foo!=0 AND DATEDIFF(hh,...))即可。 - Damien_The_Unbeliever
1
尽管现在我来看,我相当确定,无论你的目标是什么,那些DATEDIFF调用都不会做你想要的事情。提示:DATEDIFF返回一个整数,如果与datetime比较,则会被隐式转换为自1900年1月1日以来的天数。而DATEDIFF的第三个参数应该是一个日期,2将被隐式转换为1900-01-03 - Damien_The_Unbeliever
3个回答

8
尝试这个 -
SELECT foo,
       bar,
       test
FROM [table]
WHERE bar = 1
    AND (
            (
                foo = 0 
                AND 
                DATEDIFF(dd, GETDATE(), 2 ) < test
            )
        OR  
            DATEDIFF(hh, GETDATE(), 2 ) < test
        )

不遵循这个规则。在哪里指明只有在 foo = 0 时才使用 DD? - Jason Wells
3
这是相等的表达式。为什么需要使用CASE - Devart

5
你可以尝试像这样做。
SELECT foo,
       bar,
       test
FROM table
WHERE bar = 1 And
(CASE WHEN foo = 0
    then   dateDiff(dd, getDate(), 2 )
ELSE
       dateDiff(hh, getDate(), 2 ) 
END)<test

1
Msg 156, Level 15, State 1, Line 7 Incorrect syntax near the keyword 'AND'. - Devart

5

如果我要猜测您的实际目标,那就是希望从GETDATE()中减去2小时或2天以便于进行比较。

这是我认为您的目标:

SELECT foo,
       bar,
       test
FROM table
WHERE bar = 1 AND
(
   (foo = 0 AND DATEADD(day,-2, GETDATE()) < test)
   OR
   (foo<>0 AND DATEADD(hour,-2,GETDATE()) < test)
)

我不认为你真的想使用那些 DATEDIFF 函数。例如,在今天(2013年7月3日),这个表达式:

select CAST(DATEDIFF(dd,getdate(),2) as datetime)

产生的结果为1786-07-031。我假设test 是一个datetime,并进行了隐式转换。即使不是这样,DATEDIFF(dd,getdate(),2)的数值总是一个大的负数(除非在返回自20世纪之前的GETDATE()的值的机器上运行)。


1奇怪的是,我认为7月3日是一年中唯一结果具有相同月份和日期编号的一天。


抱歉,Damien,我最初的例子是错误的。我正在比较两个日期,而不是第三个参数作为 int。还是非常感谢你的详细跟进! - Jason Wells

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接