0

月に2回実行されるクエリを作成しています。

  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. 同じ月の1〜15の請求日を見ている月の20日。

    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列のインデックスを使用しません。これは、このクエリをサポートするために追加することを検討する必要があります。

これらの高価な日付部分関数をすべて実行する代わりに、純粋な日時操作を使用して制限のない範囲を構築するこの書き直しはどうでしょうか。

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 に答える