一、通过一个开始时间、结束时间计算出一个工作日天数(不包含工作日与节假日);
1、函数
- --创建函数,参数 @bengrq 开始时间,@endrq 结束时间
- create function [dbo].[f_jsgzr](@bengrq date,@endrq date)
- --返回值类型 天数
- returns int
- begin
- --计算出开始时间与结束时间的相差的天数,通过这个天数减去查询出来的节假日与休息日天数
- --@jats 节假日,@gzrts 总天数,@gzrts 返回值 工作日天数
- declare @jats int,@zts int,@gzrts int
- --数据库中存在一张记录节假日与休息日的表,通过这张表合计两个时间段中包含的节假日天数
- select @jats = count(1)
- from holidays rq where rq.hldys >= @bengrq and rq.hldys <= @endrq
- select @zts = DATEDIFF(day,@bengrq,@endrq)
- --计算工作日 = 总天数 - 假节日天数
- select @gzrts = @zts - @jats
- --返回工作日天数
- return @gzrts
- end
- --执行函数,输入参数
- SELECT [dbo].[f_jjr] ('2019-02-11','2019-02-18')
- GO
2、存储过程
- /*创建存储过程 计算工作日*/create procedure jjr
- --参数 @bengrq 开始时间,@endrq 结束时间、@gzrts 工作日天数
- @bengrq date,@endrq date,@gzrts int output as
- begin
- --计算出开始时间与结束时间的相差的天数,通过这个天数减去查询出来的节假日与休息日天数
- declare @jats int,@zts int
- --数据库中存在一张记录节假日与休息日的表,通过这张表合计两个时间段中包含的节假日天数
- select @jats = count(1)
- from holidays rq where rq.hldys >= @bengrq and rq.hldys <= @endrq
- select @zts = DATEDIFF(day,@bengrq,@endrq)
- --计算工作日 = 总天数 - 假节日天数
- select @gzrts = @zts - @jats
- print @gzrts
- --返回天数
- return @gzrts
- end
- --声明变量
- declare @bengrq date,@endrq date,@gzrts int
- --给变量赋值
- select @bengrq = '2019-02-01',@endrq = '2019-03-01'
- --调用存储过程
- EXEC jjr @bengrq,@endrq,@gzrts output
二、通过一个开始时间、天数计算出一个结束时间(不包含工作日与节假日);
使用循环来实现;
- /*创建函数通过工作日天数,获取结束时间*/
- --@bengrq 开始时间,@gzrts 工作日天数
- create function dbo.f_jsjsrq(@bengrq date,@gzrts int)
- --返回值类型 结束时间
- returns date
- begin
- --@jats 节假日,@addDate 返回值 结束日
- declare @jats int,@endrq date
- --为 @endrq 结束时间赋值,从 @bengrq 开始时间的第二天开始
- select @endrq = @bengrq --工作日天数大于0时循环查询节假日表数据
- while @gzrts >= 0
- begin
- --每次查询时 @jats 节假日等于0
- select @jats = 0
- select @jats = count(1) from holidays rq where rq.hldys = @endrq
- if @jats > 0
- begin
- select @endrq = dateadd(day,1,@endrq)
- end else begin
- --@endrq 当前日期不是节假日时工作日天数减1
- select @gzrts = @gzrts - 1
- --当工作日天数小于0时跳出循环
- if @gzrts < 0
- begin
- break;
- end
- select @endrq = dateadd(day,1,@endrq)
- end
- end
- --返回日期
- return @endrq
- end
- --执行函数,参数 开始时间、工作日天数
- SELECT dbo.f_jsjsrq ('2019-02-01',16)