SQL语句计算两个日期之间有多少个工作日的方法
程序员文章站
2023-11-22 13:33:04
/*
因为工作中一个奇怪的需求,要用sql语言计算两个日期间有多少个工作日。
设定是一个星期有5个工作日,从星期一到星期五
说明:
第一个星期的工作日...
/*
因为工作中一个奇怪的需求,要用sql语言计算两个日期间有多少个工作日。
设定是一个星期有5个工作日,从星期一到星期五
说明:
第一个星期的工作日数:datepart(dw, @begdt)-datepart(dw, @begdt),最少0天
末一个星期的工作日数:datepart(dw, @enddt),最多5天
计算方法:
如果两个日期处在同一个星期内,直接计算“第一个星期的工作日数”
否则按下面的公式计算
(两个日期间的总天数 - 第一个星期的天数 - 末一个星期的天数) / 7 * 5
+ 第一个星期的工作日数
+ 末一个星期的工作日数
*/
--计算并返回两个日期间的工作小时数(工作日*8)按周一到周五计算 --必须先set datefirst 1 create function dbo.calcworkhours(@bdate datetime, @edate datetime) returns integer as begin declare @hours integer if @@datefirst <> 1 or @bdate > @edate return -1 select @hours = --如果终止日期与起始日期在同一个星期内,只需要计算有几天即可 case when datepart(wk, @edate-1)-datepart(wk,@bdate) = 0 then case when datepart(dw, @bdate) > 5 then 0 when datepart(dw, @edate-1) > 5 then 6 - datepart(dw, @bdate) else datepart(dw, @edate-1) - datepart(dw, @bdate) + 1 end --如果终止日期与起始日期在不同的星期内 --首先计算出除前后两个星期外完整的星期数 * 5 else (datediff(dd,@bdate,@edate) - (8-datepart(dw, @bdate)) - datepart(dw, @edate-1)) / 7 * 5 --再加上第一个星期里的工作日数 + case when datepart(dw, @bdate) < 6 then 6 - datepart(dw, @bdate) else 0 end --加上末一个星期里的工作日数 + case when datepart(dw, @edate-1)>5 then 5 else datepart(dw, @edate-1) end end * 8 return @hours end
以上就是本文的全部内容,希望对大家的学习有所帮助。