6

ケース内に埋め込む方法とifステートメント。これは私がこれまでに持っているものです。

DECLARE @LDCCode as int
       DECLARE @InvoiceDate as datetime
       DECLARE @PaymentSemiMonthlyDays AS int
       SET @LDCCode = 20
       SET @InvoiceDate = '5/16/2012'
       DECLARE @InvDateDayMonth AS INT
       DECLARE @ReturnDate AS DATETIME
       SET @ReturnDate = @InvoiceDate
       DECLARE @PaymentDOM AS INT
       DECLARE @PaymentDays AS INT
       DECLARE @PaymentSemiMonthlyOffset AS INT


SET @ReturnDate = CASE WHEN NOT @PaymentDOM IS NULL THEN
   @ReturnDate + (@PaymentDOM - DATEPART(day, DateAdd(mm,1,@ReturnDate))) 
WHEN NOT @PaymentDays IS NULL THEN 
            DATEADD(Day,@PaymentDays,@ReturnDate)
WHEN NOT @PaymentSemiMonthlyOffset IS NULL THEN                     
    IF @LDCCode = 40 AND @InvDateDayMonth > 11 AND @InvDateDayMonth < 26 
       SELECT @ReturnDate + (@PaymentSemiMonthlyOffset - DATEPART(day, DateAdd(mm,1,@ReturnDate)))
    ELSE
       SELECT @ReturnDate + (@PaymentSemiMonthlyDays - DATEPART(day, DateAdd(mm,1,@ReturnDate)))    
    END 
4

2 に答える 2

8

その方法でロジックを組み合わせることはできませんが、ネストされたCASE既存のCASEステートメントを追加できます。

SET @ReturnDate = (CASE WHEN NOT @PaymentDOM IS NULL THEN
    @ReturnDate + (@PaymentDOM - DATEPART(day, DateAdd(mm,1,@ReturnDate))) 
WHEN NOT @PaymentDays IS NULL THEN 
    DATEADD(Day,@PaymentDays,@ReturnDate)
WHEN NOT @PaymentSemiMonthlyOffset IS NULL THEN
    CASE WHEN @LDCCode = 40 AND @InvDateDayMonth > 11 AND @InvDateDayMonth < 26 THEN
        @ReturnDate + (@PaymentSemiMonthlyOffset - DATEPART(day, DateAdd(mm,1,@ReturnDate)))
    ELSE
        @ReturnDate + (@PaymentSemiMonthlyDays - DATEPART(day, DateAdd(mm,1,@ReturnDate)))
    END   
END)

ただし、これがストアド プロシージャ内にある場合は、次IF/THEN/ELSEの代わりに単純な構造を選択することもできCASEます。

IF @PaymentDOM IS NULL
    SET @ReturnDate = @ReturnDate + (@PaymentDOM - DATEPART(day, DateAdd(mm, 1, @ReturnDate))) 
ELSE IF NOT @PaymentDays IS NULL
    SET @ReturnDate = DATEADD(Day,@PaymentDays,@ReturnDate)
ELSE IF NOT @PaymentSemiMonthlyOffset IS NULL
BEGIN
    IF @LDCCode = 40 AND @InvDateDayMonth > 11 AND @InvDateDayMonth < 26
        SET @ReturnDate = @ReturnDate + (@PaymentSemiMonthlyOffset - DATEPART(day, DateAdd(mm, 1, @ReturnDate)))
    ELSE
        SET @ReturnDate = @ReturnDate + (@PaymentSemiMonthlyDays - DATEPART(day, DateAdd(mm, 1, @ReturnDate)))
END
于 2012-05-08T19:57:55.853 に答える
2

すべての式が に何かを追加し、複数回@ReturnDateの後に月の日を計算するため、@ReturnDateこれは次のように簡略化できると思います。

DECLARE @Plus1M INT;
SET @Plus1M = DATEPART(DAY, DATEADD(MONTH, 1, @ReturnDate));

SET @ReturnDate = DATEADD(DAY, 
  COALESCE(
    @PaymentDays, -- if @PaymentDays IS NULL, this will be skipped
    @PaymentDOM - @Plus1M,  -- if @PaymentDOM is NULL, this will be skipped
    CASE WHEN @PaymentSemiMonthlyOffset IS NOT NULL THEN
      CASE WHEN @LDCCode = 40 AND @InvDateDayMonth BETWEEN 12 AND 25
        THEN @PaymentSemiMonthlyOffset 
        ELSE @PaymentSemiMonthlyDays 
      END - @Plus1M
    END
  ), 
  @ReturnDate
);

ただし、冗長で冗長な式として記述したい場合は、次のようにします。

SET @ReturnDate = CASE 
  WHEN @PaymentDOM IS NOT NULL THEN
    DATEADD(DAY, @PaymentDOM 
    - DATEPART(DAY, DATEADD(MONTH, 1, @ReturnDate)), @ReturnDate) 
  WHEN @PaymentDays IS NOT NULL THEN 
    DATEADD(DAY, @PaymentDays, @ReturnDate)
  WHEN @PaymentSemiMonthlyOffset IS NOT NULL THEN
    CASE WHEN @LDCCode = 40 AND @InvDateDayMonth BETWEEN 12 AND 25 THEN
      DATEADD(DAY, @PaymentSemiMonthlyOffset 
      - DATEPART(DAY, DATEADD(MONTH, 1, @ReturnDate)), @ReturnDate)
    ELSE
      DATEADD(DAY, @PaymentSemiMonthlyDays 
      - DATEPART(DAY, DATEADD(MONTH, 1, @ReturnDate)), @ReturnDate)   
    END 
  END;

ただし、既存のクエリが解析されず、サンプル データや目的の結果が表示されなかったため、確認するのは困難です。

省略形は新しい型 ( 、など)では機能しないため、省略形の使用は避け@Datetime + INT、操作を詳しく説明します。これらの略語のいくつかは自明ではないため、省略形のようなものも避けます。キャラクターが 3 人増えると、それがより明確になります。また、読むのはあまり直感的ではありません。「光は赤くない」よりも「光は赤くない」と言いたい。DATEADDDATEDATETIME2mmNOT ...something... IS NULL

于 2012-05-08T20:12:01.620 に答える