如何调整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
相关产品推荐
相关产品推荐

