【问题标题】:case statement depending on day of week within where clausecase 语句取决于 where 子句中的星期几
【发布时间】:2016-05-20 22:34:51
【问题描述】:

我正在尝试在 where 子句中编写 case 语句。以下是我的查询。我想根据工作日执行查询。基本上,如果是星期一,则需要 datecreated = getdate()-3 如果是星期二,则它需要是在 getdate()-3 和 getdate()-1 之间创建的范围日期 如果是周三-周五,则需要 datecreated = getdate()-1

 SELECT Count(dispute_reference_no)AS reg_inc 
 FROM   mytable 
 WHERE  reasoncd IN ('b2', 'b3') 
 AND    datecreated = ( 
        CASE 
           WHEN Datename(weekday,Getdate()) = 'Monday' THEN dbo.Fn_getdateonly(Getdate()-3))
           WHEN datename(weekday,getdate()) = 'tuesday' THEN (dbo.fn_getdateonly(getdate()-3) 
 AND    dbo.fn_getdateonly(getdate())) 
 ELSE dbo.fn_getdateonly(getdate()-1) 
END)

上面的代码不起作用。它不会让我在 case 语句中添加范围。

【问题讨论】:

  • 很难知道你想要什么,但你的括号放错了地方
  • 正确使用CASE的方法是CASE WHEN ... WHEN ... END 你的END与Case无关
  • 忘记错误。你的意思是need to be a range datecreated 你不能在CASE 上创建一个范围并与单个值进行比较
  • 好的,所以如果工作日是星期二,那么我需要说在 getdate()-3 和 getdate()-1 之间创建的日期

标签: sql select case


【解决方案1】:

您不能像这样动态重写您的where 子句,但您可以通过使用一系列逻辑运算符来获得所需的行为:

SELECT COUNT(Dispute_Reference_no) AS reg_inc
FROM   mytable 
WHERE  reasoncd in ('b2', 'b3') AND
       ((DATENAME(weekday, GETDATE()) = 'monday' AND 
         datecreated = dbo.fn_getdateonly(GETDATE()-3)) OR
        (DATENAME(weekday, GETDATE()) = 'tuesday' AND 
         datecreated BETWEEN dbo.fn_getdateonly(GETDATE()-3) AND 
                             dbo.fn_getdateonly(GETDATE())) OR
        (atecreated = dbo.fn_getdateonly(GETDATE()-1)
       )

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 2021-07-21
    • 1970-01-01
    • 2020-03-26
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多