tsql动态在哪里

tsql动态在哪里,tsql,Tsql,我正在为这个程序而挣扎 如果是星期一到星期四,我希望一切都提前90天完成 SELECT PR.ClientID ,PR.NewDealEndDate INTO #OriginalRenewalDetails FROM Shiva.dbo.ProductRemortgage PR WITH (NOLOCK) LEFT JOIN Shiva.dbo.ClientLead AS CL WITH (NO

我正在为这个程序而挣扎

如果是星期一到星期四,我希望一切都提前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
我找不到一个有效的方法来做这件事。感谢您的帮助。

如果需要,请使用

伪:

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)
使用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)

您可以执行以下操作:

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
    )
)

您可以执行以下操作:

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
    )
)

这里不需要动态SQL或两个单独的查询。将**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;

这里不需要动态SQL或两个单独的查询。将**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;

同意,在已发布查询外部使用IF运行两条语句中的一条,而不是重载一条语句。同意,在已发布查询外部使用IF运行两条语句中的一条,而不是重载一条语句。