【问题标题】:Case Statement in Where Clause for datediffdatediff 的 Where 子句中的案例陈述
【发布时间】:2017-06-29 07:53:29
【问题描述】:

我试图让报告仅显示发票日期为前一天的记录,除非今天是星期一,在这种情况下,如果发票日期是星期五,它会拉出。

正如标题所暗示的那样,我试图实现这一点是我的 where 子句中的一个案例陈述。

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)

您可能从上面的代码中可以看出,当涉及到 SQL 查询时,我完全是个菜鸟,而且它充满了语法错误。上面需要纠正什么才能使其正常工作?还是我完全看错了?

【问题讨论】:

    标签: sql tsql case where


    【解决方案1】:

    来点更简单的怎么样:

    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 子句中的函数会阻止使用索引。一个例外(唯一的例外?)是 casting datetime 值到日期。 Here 是关于该主题的博客。

    【讨论】:

    • 感谢您的知识,戈登!我在这里遇到语法错误,Incorrect syntax near 'cast', expected 'AS'.
    • cast(dateadd(day, -1, getdate())) 更改为cast(dateadd(day, -1, getdate()) as date)cast(dateadd(day, -3, getdate())) 更改为cast(dateadd(day, -3, getdate()) as date) @aLearningLady
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多