求某天之后的三个工作日

来源:互联网 发布:指南针软件使用教程 编辑:程序博客网 时间:2024/06/06 04:47
--0.建立表和数据(这里只是临时用一下方便显示,你自己用真实表)DECLARE @SpecDate TABLE(ID UNIQUEIDENTIFIER,TheDate DATETIME NOT NULL,Flag  INT NOT NULL--1. 工作日,0. 休息)INSERT INTO @SpecDate select NEWID(),'2013-1-1',0 UNIONselect NEWID(),'2013-1-2',0 UNIONselect NEWID(),'2013-1-3',0 UNIONselect NEWID(),'2013-1-5',1 UNIONselect NEWID(),'2013-1-6',1SELECT * FROM @SpecDate ORDER BY TheDate DESC--1. 求某天之后的3个工作日DECLARE @beginDate DATETIME-- 开始日期DECLARE @result TABLE(-- 最终结果DT     DATETIME)DECLARE @count INT-- 结果中有几条记录DECLARE @maxCount INT-- 最多允许有几天SET @beginDate='2012-12-31'SET @count = 0SET @maxCount = 3DECLARE @tempDate DATETIME,@weekday INTSET @tempDate=DATEADD(DAY,1,@beginDate)WHILE (@count<@maxCount)BEGIN--如果特殊日期表中存在,而且此日期为工作日,插入临时表IF EXISTS( SELECT 1 FROM @SpecDate WHERE DATEDIFF(DAY,@tempDate,TheDate)=0 AND FLAG=1)BEGININSERT INTO @result SELECT @tempDateSET @count=@count+1END--否则如果此日期在配置表中也不是休息日(没有特殊设置)ELSE IF NOT EXISTS( SELECT 1 FROM @SpecDate WHERE DATEDIFF(DAY,@tempDate,TheDate)=0 AND FLAG=0)BEGIN--求得星期数SET @weekday = Datepart(weekday, @tempDate + @@DateFirst - 1)--如果不是周六周日,也将其保存IF (@weekday!=6 OR @weekday!=7)BEGININSERT INTO @result SELECT @tempDateSET @count=@count+1ENDEND-- 往后推一天SET @tempDate=DATEADD(DAY,1,@tempDate)ENDSELECT * FROM @result ORDER BY DT