本文主要是介绍分析邹健大哥的算法,终于问题解决了!!!(关于统计两日期间工作日),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
-- 计算两个日期之间相差的工作天数(本算法以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 ,谢谢邹大哥,写这么优秀的算法,
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 ,谢谢邹大哥,写这么优秀的算法,
这篇关于分析邹健大哥的算法,终于问题解决了!!!(关于统计两日期间工作日)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!