分析邹健大哥的算法,终于问题解决了!!!(关于统计两日期间工作日)

来源:互联网 发布:网络八大虚拟人物名字 编辑:程序博客网 时间:2024/05/17 00:12
--计算两个日期之间相差的工作天数(本算法以2006-9-1至2006-9-30为例说明) 
CREATE FUNCTION f_WorkDateDiff
@dt_begin datetime----统计开始日期 
@dt_end datetime)----统计结束日期 
RETURNS int ----返回相差天数 
AS 
BEGIN
 
/*------@workday,工作日;@bz,作开始和结束日期的大小标志位;@dt,作为交换两日期的变量;-----*/ 
DECLARE @workday int,@i int,@bz bit,@dt datetime 
IF @dt_begin>@dt_end ----开始日期大于结束日期,二者交换,且FU值各变量 
SELECT @bz=1,@dt=@dt_begin,@dt_begin=@dt_end,@dt_end=@dt 
ELSE ---与上面相反的话,为标志位取另一个数(用标志位,是为下面返回值判断用) 
SET @bz=0 
SELECT @i=DATEDIFF(Day,@dt_begin,@dt_end)+1-- 加1包括本天 @workday=@i/7*5,----取出经历多少工作日,以5天计(记住,若是整周倍数,进入下面CIRLCE) ---------------------------------------------------------- ----这一句特别重要,理解这一句,很重要,给@dt_begin从2006-9-29进入CIRLCE 
@dt_begin=DATEADD(Day,@i/7*7,@dt_begin
WHILE @dt_begin<=@dt_end 
BEGIN 
SELECT @workday=CASE 
WHEN (@@DATEFIRST+DATEPART(Weekday,@dt_begin)-1)%7 BETWEEN 1 AND 5 ----判断开始日期在1:5内 
THEN @workday+1 
ELSE @workday END
@dt_begin=@dt_begin+1 ---+1,然后WHILE 
END 
RETURN(CASE WHEN @bz=1 THEN -@workday ELSE @workday END)---返回值判断 END 
GO 
注:
1@dt_begin的灵活运用,非常妙,
 
2,这个CIRLCE语句非常的好,学习,以后也要这么用, 
3,RETURN语句中的CASE,开了眼界 
4,谢谢邹大哥,写这么优秀的算法,