SQL Server函数与存储过程 计算时间
程序员文章站
2022-05-27 22:35:26
一、通过一个开始时间、结束时间计算出一个工作日天数(不包含工作日与节假日); 1、函数 2、存储过程 二、通过一个开始时间、天数计算出一个结束时间(不包含工作日与节假日); 使用循环来实现; ......
一、通过一个开始时间、结束时间计算出一个工作日天数(不包含工作日与节假日);
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)
上一篇: 贾宝玉和袭人云雨过后,林黛玉说了三个字,袭人咬牙切齿
下一篇: python采集微信公众号文章