2017-02-10 72 views
0

我试图让一个报告只显示记录,其中发票日期是前一天,除非今天是星期一,在这种情况下,如果发票日期是星期五,它会拉。在哪里条款陈述的案例声明

正如标题暗示我试图完成这个是我的where子句中的一个case语句。

WHERE 
(case when datepart(dw,GETDATE()) <> 2 
then (INVOICE >= dateadd(day,datediff(day,1,GETDATE()),0)) 
else INVOICE >= dateadd(day,datediff(day,3,GETDATE()),0) end) 
and (case when datepart(dw,GETDATE()) <> 2 
then (INVOICE < dateadd(day,datediff(day,0,GETDATE()),0)) 
else INVOICE <dateadd(day,datediff(day,2,GETDATE()),0) end) 

正如你可能从上面的代码告诉,我是一个完整的noob当涉及到SQL查询,这是充满了语法错误。上面需要纠正什么才能使其发挥作用?或者我看着这完全错误?

回答

2

如何更简单的东西:

where (datepart(dw, GETDATE()) <> 2 and 
     cast(invoice as date) = cast(dateadd(day, -1, getdate()) as date) 
    ) or 
     (datepart(dw, GETDATE()) = 2 and 
     cast(invoice as date) = cast(dateadd(day, -3, getdate()) as date) 
    ) 

一般来说,where子句中的功能防止使用索引。有一个例外(唯一例外?)是datetime值赋值给日期。 Here是一个关于这个主题的博客。

+0

谢谢你的知识,戈登!我在这里得到了一个语法错误,''cast'附近的语法错误',预期为'AS'。' – aLearningLady

+2

将'cast(dateadd(day,-1,getdate()))'更改为'cast(dateadd(day, -1,getdate())作为日期)'和'cast(dateadd(day,-3,getdate()))'''cast(dateadd(day,-3,getdate())as date)'@aLearningLady – scsimon