2013-07-03 51 views
3

SQL不是我的强项,但我无法弄清楚为什么这不起作用。我只是想根据一个值运行一个不同的AND语句。具体而言,我想改变日期部分中DateDiff函数,如果foo是= 0SQL Server 2012 - Case语句在where子句

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 
+0

你在查询中遇到了语法错误 –

+0

我不知道为什么,但这是人们在SQL中犯的一个常见错误 - 他们真的需要引入一个CASE表达式,他们真正需要的是基本的逻辑运算符。 –

+0

达米安,谨慎推断? –

回答

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 
     ) 
+0

没有关注这个..如果foo = 0,说的只是使用DD的情况在哪里 –

+3

这是平等的表达。你为什么需要'CASE'? – Devart

+0

哦,谢谢你 - 每天学习新东西。 –

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

'消息156,级别15,状态1,行7 关键字“AND'.' – Devart

+0

@Devart附近的语法不正确,我认为现在其确定.... –

+0

+1 - 为好答案。 – Devart

5

如果我有猜测你实际瞄准的是什么,这是你想从GETDATE()减去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-03 。我假设testdatetime并且正在执行隐式转换。即使不是,的DATEDIFF(dd,getdate(),2)数值将始终是一个大的负数(除非或直到它是一个机器,其中GETDATE()从20世纪前返回一个值上运行)


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

+1

+1 - 为了好的答案。 – Devart

+0

对不起达米安,我最初的例子是错的。我比较2日期而不是int作为第3个参数。感谢您的彻底跟进! –