You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整SQL插入查询,处理周末及银行假日的AnnDate字段?

整合银行假日调整到现有插入查询的方案

嘿,这个需求很好实现,完全可以整合到你现有的INSERT查询里,不用单独写新的语句~我分两种场景给你方案,你可以根据实际情况选:

场景1:仅对原日期(或调整周末后的日期)做一次银行假日检查

如果你的业务逻辑是:只要日期是银行假日就加1天,不管加1天后是否又遇到假日或周末,那可以用嵌套CASE或者子查询先处理周末,再检查银行假日:

INSERT INTO myTbl (AnnDate, [其他需要插入的字段])
SELECT 
    -- 对调整周末后的日期,再检查是否是银行假日
    CASE 
        WHEN EXISTS (SELECT 1 FROM tblBankHoliday WHERE BankHolidayDate = WeekendAdjustedDate)
            THEN DATEADD(day, 1, WeekendAdjustedDate)
        ELSE WeekendAdjustedDate
    END AS FinalAnnDate,
    [其他需要插入的字段]
FROM (
    -- 先处理周末的日期调整
    SELECT 
        CASE 
            -- 这里的(1,7)要根据你的SQL Server DATEFIRST设置调整,比如如果周六是6、周日是7就改成(6,7)
            WHEN DATEPART(dw, AnnDate) IN (1, 7) 
                THEN DATEADD(day, 
                    CASE DATEPART(dw, AnnDate) 
                        WHEN 1 THEN 1 -- 周日调整到周一
                        WHEN 7 THEN 2 -- 周六调整到周一
                    END, 
                    AnnDate)
            ELSE AnnDate
        END AS WeekendAdjustedDate,
        [其他需要插入的字段]
    FROM myTblTemp
) AS AdjustedWeekendData

场景2:确保最终日期是非周末且非银行假日

如果加1天后可能又遇到银行假日或周末,你需要把日期一直调整到第一个有效的工作日,那用递归CTE的方式更可靠:

WITH DateAdjustments AS (
    -- 第一步:先处理周末的初始调整
    SELECT 
        CASE 
            WHEN DATEPART(dw, AnnDate) IN (1,7)
                THEN DATEADD(day, CASE DATEPART(dw, AnnDate) WHEN 1 THEN 1 WHEN7 THEN2 END, AnnDate)
            ELSE AnnDate
        END AS CurrentDate,
        [其他需要插入的字段],
        [你的唯一标识字段], -- 比如myTblTemp里的ID,用来关联每条记录的调整过程
        1 AS AdjustmentCount -- 计数器,防止无限循环
    FROM myTblTemp

    UNION ALL

    -- 递归调整:只要当前日期是银行假日或周末,就继续加1天
    SELECT 
        DATEADD(day, 1, CurrentDate),
        [其他需要插入的字段],
        [你的唯一标识字段],
        AdjustmentCount + 1
    FROM DateAdjustments
    WHERE 
        (EXISTS (SELECT 1 FROM tblBankHoliday WHERE BankHolidayDate = CurrentDate)
        OR DATEPART(dw, CurrentDate) IN (1,7))
        AND AdjustmentCount < 10 -- 限制最多调整10次,避免死循环
)
-- 取每条记录最后一次调整后的有效日期
INSERT INTO myTbl (AnnDate, [其他需要插入的字段])
SELECT 
    CurrentDate AS FinalAnnDate,
    [其他需要插入的字段]
FROM DateAdjustments
WHERE AdjustmentCount = (
    SELECT MAX(AdjustmentCount) 
    FROM DateAdjustments AS DA 
    WHERE DA.[你的唯一标识字段] = DateAdjustments.[你的唯一标识字段]
);

几个关键注意点:

  • DATEPART的星期取值:不同SQL Server的DATEFIRST设置会影响DATEPART(dw, 日期)的结果,比如有的环境周日是1,有的是7。你可以先执行SELECT DATEPART(dw, GETDATE())测试今天的取值,再调整CASE里的数字。
  • 银行假日表字段名:如果你的tblBankHoliday里存储日期的字段不是BankHolidayDate,记得改成实际的字段名。
  • 唯一标识字段:递归方案里必须用唯一标识(比如ID)来关联每条记录的调整过程,不然会出错。

内容的提问来源于stack exchange,提问作者mHelpMe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:15:40