日期:2014-05-16 浏览次数:20500 次
--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 UNION select NEWID(),'2013-1-2',0 UNION select NEWID(),'2013-1-3',0 UNION select NEWID(),'2013-1-5',1 UNION select NEWID(),'2013-1-6',1 SELECT * 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 = 0 SET @maxCount = 3 DECLARE @tempDate DATETIME,@weekday INT SET @tempDate=DATEADD(DAY,1,@beginDate) WHILE (@count<@maxCount) BEGIN --如果特殊日期表中存在,而且此日期为工作日,插入临时表 IF EXISTS( SELECT 1 FROM @SpecDate WHERE DATEDIFF(DAY,@tempDate,TheDate)=0 AND FLAG=1) BEGIN INSERT INTO @result SELECT @tempDate SET @count=@count+1 END --否则如果此日期在配置表中也不是休息日(没有特殊设置) 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) BEGIN INSERT INTO @result SELECT @tempDate SET @count=@count+1 END END -- 往后推一天 SET @tempDate=DATEADD(DAY,1,@tempDate) END SELECT * FROM @result ORDER BY DT