SQL Server2008设计一个函数的问题
我想设计一个函数,实现功能是输入日期和天数,返回具体的工作日日期(工作日不包括周六、周日、节假日),例如输入日期:201203,天数:10,返回工作日日期是20120314。
我现在的问题是节假日不知道该怎样去判断??
我目前的思路是创建一个节日表,我把国家通告的放假时间都输入进去了,然后通过这个表去判断节假日,但具体SQL不知道怎样去实现?
这是基础数据源码:(我输入了2年节日信息)
USE tempdb;GOIF OBJECT_ID('furlough') IS NOT NULLDROP TABLE furlough;GO/*创建节日表*/CREATE TABLE furlough(id INT IDENTITY(1,1),--节日ID fname VARCHAR(20) ,--节日名称 FurloughStarttime DATETIME,--开始放假时间 FurloughEndtime DATETIME, --结束放假时间 updatetime datetime --更新时间 );-- 添加数据INSERT INTO dbo.furlough VALUES ('元旦','20120101','20120103',GETDATE());INSERT INTO dbo.furlough VALUES ('春节','20120122','20120128',GETDATE());INSERT INTO dbo.furlough VALUES ('清明节','20120402','20120404',GETDATE());INSERT INTO dbo.furlough VALUES ('劳动节','20120429','20120501',GETDATE());INSERT INTO dbo.furlough VALUES ('端午节','20120622','20120624',GETDATE());INSERT INTO dbo.furlough VALUES ('国庆节','20120930','20121007',GETDATE());INSERT INTO dbo.furlough VALUES ('元旦','20121230','20130101',GETDATE());INSERT INTO dbo.furlough VALUES ('春节','20130209','20130215',GETDATE());INSERT INTO dbo.furlough VALUES ('清明节','20130404','20130406',GETDATE());INSERT INTO dbo.furlough VALUES ('劳动节','20130429','20130501',GETDATE());INSERT INTO dbo.furlough VALUES ('端午节','20130610','20130612',GETDATE());INSERT INTO dbo.furlough VALUES ('中秋节','20130919','20120921',GETDATE());INSERT INTO dbo.furlough VALUES ('国庆节','20131001','20131007',GETDATE());GOIF TYPE_ID('tyWorkday') IS NOT NULL DROP TYPE tyWorkday;GO /*工作日日期*/ CREATE TYPE tyWorkday AS TABLE (Id INT IDENTITY(1,1), Workday DATETIME);
IF OBJECT_ID('fnWorkday') IS NOT NULLDROP FUNCTION fnWorkday;GOCREATE FUNCTION fnWorkday(@date INT , @n INT )RETURNS DATETIMEAS BEGIN DECLARE @m INT ,--增长的天数 @d INT ,--当月的天数 @wdate VARCHAR(10), --工作日期 @tyw AS tyWorkday, @workday DATETIME --需要返回的工作日期 SET @m=1; SET @wdate=@date*100+@m; SET @d=DATEDIFF(DAY,@wdate,DATEADD(MONTH,1,@wdate )); WHILE @m<=@d BEGIN SET @wdate=@date*100+@m; /*当日期不是周六、周日的时候插入到@tyw表*/ IF DATEPART(dw,@wdate) NOT IN (1,7) BEGIN INSERT INTO @tyw VALUES(@wdate); END; SET @m=@m+1; END; SELECT @workday=Workday FROM @tyw WHERE Id=@n; RETURN @workday;END;
FROM tb_Holiday
WHERE HDate BETWEEN @date AND @date+@workday
ELSE
WHILE @workday<0
SELECT @date=@date+@workday,@workday=-count(*)
FROM tb_Holiday
WHERE HDate BETWEEN @date AND @date+@workday
RETURN(@date)
END
[解决办法]
你这个一个表是搞不定的了,至少得有一个节假日的表。。法定假期是经常改的。亲
[解决办法]
不清楚你是什么需求
我觉得如果是具体项目的话
建一张日期表,日期 工作日标志 每年年末根据国家放假通知建下一年度的表
这个实现你的需求就很简单了