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

被折叠的 条评论
为什么被折叠?



