首页
学习
活动
专区
圈层
工具
发布

tsql动态
EN

Stack Overflow用户
提问于 2012-05-21 22:23:04
回答 4查看 129关注 0票数 1

我在这个过程中苦苦挣扎。

如果是周一到周四,我希望所有的事情都提前90天;

代码语言:javascript
复制
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子句中更改以下内容。这样我也能得到周五和周六的结果。

代码语言:javascript
复制
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

我找不到一种有效的方法来做这件事。感谢您的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-21 22:45:28

这里不需要动态SQL或两个单独的查询。将**DAY = SUNDAY**部件替换为您当前用于确定日期是星期天的逻辑:

代码语言:javascript
复制
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;

你也可以预先计算出范围,例如

代码语言:javascript
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2012-05-21 22:26:04

使用IF

伪:

代码语言:javascript
复制
if day = sunday
begin
   select with 88
end
else 
begin
   select with 90
end

或者将WHERE子句更改为类似以下内容:

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2012-05-21 22:35:30

您可以执行以下操作:

代码语言:javascript
复制
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
    )
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10687097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档