0

我正在创建一个每月运行两次的查询:

  1. 每月 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()))
    
  2. 每月 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

治愈我的无知。

4

2 回答 2

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;
于 2012-05-22T17:52:42.530 回答
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()))
)
于 2012-05-22T17:54:22.657 回答