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

--计算两个日期之间相差的工作天数(本算法以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,谢谢邹大哥,写这么优秀的算法,
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值