如果日期属于周末或银行假日,则调整日期

时间:2018-05-08 09:50:26

标签: sql sql-server

我有一个查询将一些新记录插入表中,myTbl来自临时表myTblTemp。

在查询中,如果日期是星期六或星期日,我会调整其中一个字段'AnnDate'。但是,如果日期是银行假日,我还需要调整AnnDate。

我有一张桌子,tblBankHoliday列出了所有需要的银行假期。如果在tblBankHoliday中找到AnnDate,如何调整我的查询(或者我是否需要单独的查询),这将增加一天的日期?

我当前的查询

insert into myTbl(AnnDate, USDVal)
case DATENAME(WEEKDAY, AnnDate) 
       when 'Saturday' 
       then DATEADD(DD, 2, AnnDate) 
       when 'Sunday' 
       then DATEADD(DD, 1, AnnDate) 
       else AnnDate 
end
from myTblTemp

2 个答案:

答案 0 :(得分:1)

制作一张表格,例如thedays。插入相关期间的所有日期。例如在theday列中。在另一栏例如isworkday标记工作日,其中1个非工作日为0。

然后,您可以在查询中的某一天或之后选择下一个工作日。

insert into myTbl(AnnDate, USDVal)
(SELECT min(theday)
        FROM thedays
        WHERE theday >= AnnDate
              AND theday.isworkday = 1)
...
from myTblTemp

答案 1 :(得分:1)

Sticky bit的答案对你的情况更好。

您可以使用递归CTE在无效日期之间循环,并持续增加1天,直到您的验证完成。

;WITH PatchedDates AS
(
    SELECT
        InitialAnnDate = C.AnnDate,
        CorrectedAnnDate = C.AnnDate,
        USDVal = C.USDVal,
        IsDateOK = CASE 
            WHEN 
                EXISTS (SELECT 1 FROM tblBankHoliday AS X WHERE X.BankHoliday = C.AnnDate) OR 
                DATENAME(WEEKDAY, C.AnnDate) IN ('Saturday', 'Sunday') THEN 'No' 
            ELSE 'Yes' END
    from 
        myTblTemp AS C
        LEFT JOIN tblBankHoliday AS T ON C.AnnDate = T.BankHoliday

    UNION ALL

    SELECT
        InitialAnnDate = C.InitialAnnDate,
        CorrectedAnnDate = DATEADD(DAY, 1, C.CorrectedAnnDate),
        USDVal = C.USDVal,
        IsDateOK = CASE 
            WHEN 
                EXISTS (SELECT 1 FROM tblBankHoliday AS X WHERE X.BankHoliday = DATEADD(DAY, 1, C.CorrectedAnnDate)) OR 
                DATENAME(WEEKDAY, DATEADD(DAY, 1, C.CorrectedAnnDate)) IN ('Saturday', 'Sunday') THEN 'No' 
            ELSE 'Yes' END
    FROM
        PatchedDates AS C
    WHERE
        C.IsDateOK = 'No'
)
insert into myTbl(
    AnnDate, 
    USDVal)
SELECT
    AnnDate = C.CorrectedAnnDate,
    USDVal = C.USDVal
FROM
    PatchedDates AS C
WHERE
    C.IsDateOK = 'Yes'