我正在创建一个每月运行两次的查询:
本月5日查看上个月16个月的结算天数。
datepart(dd,h.BILLED_DATE) > 15
DATEPART(mm, h.billed_date) = DATEPART(mm,dateadd(m,-1,getdate()))
and DATEPART(yyyy, h.billed_date) = DATEPART(yyyy,dateadd(m,-1,getdate()))
本月20日,查看当月1-15的结算日。
datepart(dd,h.BILLED_DATE) >= 1
and datepart(dd,h.BILLED_DATE) < 16
and DATEPART(mm, h.BILLED_DATE) = DATEPART(mm,GETDATE())
and DATEPART(yyyy, h.BILLED_DATE) = DATEPART(yyyy,GETDATE()))
这些在where子句中独立工作。然而,当我尝试将它们组合在where子句中的case语句中时,我得到的错误很多,从“then”之后的第一个不等式开始。
Where
Case
when datepart(dd,getdate()) > 15
then [2 above]
else [1 above]
End
治愈我的无知。
答案 0 :(得分:3)
CASE是一个返回单个值的表达式。您不能像在其他语言中那样使用它来控制流量。
您的查询也不会在billed_date列中使用任何索引,您应该考虑添加这些索引以支持此查询。
这个重写怎么样,它使用纯日期时间操作来构建开放式范围,而不是执行所有那些昂贵的datepart函数:
DECLARE @today SMALLDATETIME, @start SMALLDATETIME, @end SMALLDATETIME;
SET @today = DATEADD(DAY, 0, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP));
SET @start = DATEADD(DAY, 1-DAY(@today), @today);
SET @end = DATEADD(DAY, 15, @start);
IF DATEPART(DAY, @today) <= 15
BEGIN
SET @start = DATEADD(MONTH, -1, @end);
SET @end = DATEADD(DAY, 1-DAY(@today), @today);
END
SELECT ... WHERE h.billed_date >= @start AND h.billed_date < @end;
答案 1 :(得分:0)
这应该这样做
WHERE (
datepart(dd,getdate()) > 15
AND DATEPART(mm, enc.hosp_admsn_time) = DATEPART(mm,dateadd(m,-1,getdate()))
AND DATEPART(yyyy, enc.hosp_admsn_time) = DATEPART(yyyy,dateadd(m,-1,getdate()))
) OR (
datepart(dd,h.BILLED_DATE) >= 1
and datepart(dd,h.BILLED_DATE) < 16
and DATEPART(mm, h.BILLED_DATE) = DATEPART(mm,GETDATE())
and DATEPART(yyyy, h.BILLED_DATE) = DATEPART(yyyy,GETDATE()))
)