1

この手続きに困っています。

月曜日から木曜日までの場合、90 日先のすべてが必要です。

SELECT 
        PR.ClientID
        ,PR.NewDealEndDate
    INTO 
      #OriginalRenewalDetails
    FROM  
        Shiva.dbo.ProductRemortgage PR WITH (NOLOCK) 
        LEFT JOIN Shiva.dbo.ClientLead AS CL WITH (NOLOCK) 
        ON CONVERT(VARCHAR(50), CL.OriginatorReferenceID) = CONVERT(VARCHAR(50), PR.ClientID)
    WHERE -- 90 days from now. 
        PR.NewDealEndDate = DATEADD(dd, 90, DATEDIFF(dd, 00, GETDATE()))            
        AND CL.ClientID IS NULL

ただし、日曜日の場合は、Where 句で次のように変更します。金曜日と土曜日の結果も得られるように。

WHERE -- 90 days from now. 
    PR.NewDealEndDate BETWEEN DATEADD(dd, 88, DATEDIFF(dd, 00, GETDATE())) AND DATEADD(dd, 90, DATEDIFF(dd, 00, GETDATE()))
    AND CL.ClientID IS NULL

これを行う効率的な方法が見つかりません。どんな助けでも感謝します。

4

4 に答える 4

2

を使用しIFます。

擬似:

if day = sunday
begin
   select with 88
end
else 
begin
   select with 90
end

または、WHERE 句を次のように変更します。

WHERE (PR.NewDealEndDate = DATEADD(dd, 90, DATEDIFF(dd, 00, GETDATE()))
       AND CL.ClientID IS NULL AND Datepart(weekday, getdate()) <> 1)
      OR
      (PR.NewDealEndDate BETWEEN DATEADD(dd, 88, DATEDIFF(dd, 00, GETDATE())) 
       AND DATEADD(dd, 90, DATEDIFF(dd, 00, GETDATE()))
       AND CL.ClientID IS NULL
       AND Datepart(weekday, getdate()) = 1)
于 2012-05-21T14:26:04.430 に答える
1
declare @adjustment int--SELECT DATEPART(weekday, getdate()) 
set @adjustment =
CASE 
    WHEN DATEPART(weekday, getdate()) 
    in (1,2,3,4,5) THEN 90     
ELSE 88
END

WHERE  
    PR.NewDealEndDate BETWEEN DATEADD(dd, @adjustment...
于 2012-05-21T14:41:16.127 に答える
1

次のことができます。

SELECT PR.ClientID
        , PR.NewDealEndDate
INTO #OriginalRenewalDetails
FROM Shiva.dbo.ProductRemortgage PR WITH (NOLOCK) 
LEFT JOIN Shiva.dbo.ClientLead AS CL WITH (NOLOCK) 
    ON CONVERT(VARCHAR(50), CL.OriginatorReferenceID) = CONVERT(VARCHAR(50), PR.ClientID)
WHERE CL.ClientID IS NULL
AND
(
    (
        PR.NewDealEndDate = DATEADD(dd, 90, DATEDIFF(dd, 00, GETDATE()))
        AND  Datepart(weekday, getdate()) <> 1 -- 1 is Sunday
    )
    OR
    (
        PR.NewDealEndDate BETWEEN DATEADD(dd, 88, DATEDIFF(dd, 00, GETDATE())) 
        AND DATEADD(dd, 90, DATEDIFF(dd, 00, GETDATE()))
        AND Datepart(dayofweek, getdate()) = 1
    )
)
于 2012-05-21T14:35:30.100 に答える
1

ここでは、動的 SQL や 2 つの個別のクエリは必要ありません。**DAY = SUNDAY**この部分を、日が日曜日であると判断するために現在使用しているロジックに置き換えます。

WHERE PR.NewDealEndDate BETWEEN DATEADD(DAY, 
    CASE WHEN **DAY = SUNDAY** THEN 88 ELSE 90 END, 
    DATEDIFF(DAY, 0, GETDATE())) AND DATEADD(DAY, 90, DATEDIFF(dd, 0, GETDATE()))
AND CL.ClientID IS NULL;

範囲を事前に計算することもできます。

DECLARE @start SMALLDATETIME, @end SMALLDATETIME;

SET @end = DATEADD(DAY, 90, DATEDIFF(DAY, 0, GETDATE()));
SET @start = CASE WHEN **DAY = SUNDAY** THEN DATEADD(DAY, -2, @end) ELSE @end END;

WHERE PR.NewDealEndDate BETWEEN @start END @end
AND CL.ClientID IS NULL;
于 2012-05-21T14:45:27.500 に答える