-- 计算两个日期之间相差的工作天数(本算法以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 & gt; @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 ,谢谢邹大哥,写这么优秀的算法,