经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
SQL Server函数与存储过程 计算时间
来源:cnblogs  作者:RainHouse  时间:2019/3/13 8:53:09  对本文有异议

一、通过一个开始时间、结束时间计算出一个工作日天数(不包含工作日与节假日);

  1、函数

  1. --创建函数,参数 @bengrq 开始时间,@endrq 结束时间
  2. create function [dbo].[f_jsgzr](@bengrq date,@endrq date)
  3. --返回值类型 天数
  4. returns int
  5. begin
  6. --计算出开始时间与结束时间的相差的天数,通过这个天数减去查询出来的节假日与休息日天数
  7. --@jats 节假日,@gzrts 总天数,@gzrts 返回值 工作日天数
  8. declare @jats int,@zts int,@gzrts int
  9. --数据库中存在一张记录节假日与休息日的表,通过这张表合计两个时间段中包含的节假日天数
  10. select @jats = count(1)
  11. from holidays rq where rq.hldys >= @bengrq and rq.hldys <= @endrq
  12. select @zts = DATEDIFF(day,@bengrq,@endrq)
  13. --计算工作日 = 总天数 - 假节日天数
  14. select @gzrts = @zts - @jats
  15. --返回工作日天数
  16. return @gzrts
  17. end
  18. --执行函数,输入参数
  19. SELECT [dbo].[f_jjr] ('2019-02-11','2019-02-18')
  20. GO

 2、存储过程

  1. /*创建存储过程 计算工作日*/create procedure jjr
  2. --参数 @bengrq 开始时间,@endrq 结束时间、@gzrts 工作日天数
  3. @bengrq date,@endrq date,@gzrts int output as
  4. begin
  5. --计算出开始时间与结束时间的相差的天数,通过这个天数减去查询出来的节假日与休息日天数
  6. declare @jats int,@zts int
  7. --数据库中存在一张记录节假日与休息日的表,通过这张表合计两个时间段中包含的节假日天数
  8. select @jats = count(1)
  9. from holidays rq where rq.hldys >= @bengrq and rq.hldys <= @endrq
  10. select @zts = DATEDIFF(day,@bengrq,@endrq)
  11. --计算工作日 = 总天数 - 假节日天数
  12. select @gzrts = @zts - @jats
  13. print @gzrts
  14. --返回天数
  15. return @gzrts
  16. end
  17. --声明变量
  18. declare @bengrq date,@endrq date,@gzrts int
  19. --给变量赋值
  20. select @bengrq = '2019-02-01',@endrq = '2019-03-01'
  21. --调用存储过程
  22. EXEC jjr @bengrq,@endrq,@gzrts output  

二、通过一个开始时间、天数计算出一个结束时间(不包含工作日与节假日);

  使用循环来实现;

  1. /*创建函数通过工作日天数,获取结束时间*/
  2. --@bengrq 开始时间,@gzrts 工作日天数
  3. create function dbo.f_jsjsrq(@bengrq date,@gzrts int)
  4. --返回值类型 结束时间
  5. returns date
  6. begin
  7. --@jats 节假日,@addDate 返回值 结束日
  8. declare @jats int,@endrq date
  9. -- @endrq 结束时间赋值,从 @bengrq 开始时间的第二天开始
  10. select @endrq = @bengrq --工作日天数大于0时循环查询节假日表数据
  11. while @gzrts >= 0
  12. begin
  13. --每次查询时 @jats 节假日等于0
  14. select @jats = 0
  15. select @jats = count(1) from holidays rq where rq.hldys = @endrq
  16. if @jats > 0
  17. begin
  18. select @endrq = dateadd(day,1,@endrq)
  19. end else begin
  20. --@endrq 当前日期不是节假日时工作日天数减1
  21. select @gzrts = @gzrts - 1
  22. --当工作日天数小于0时跳出循环
  23. if @gzrts < 0
  24. begin
  25. break;
  26. end
  27. select @endrq = dateadd(day,1,@endrq)
  28. end
  29. end
  30. --返回日期
  31. return @endrq
  32. end
  33. --执行函数,参数 开始时间、工作日天数
  34. SELECT dbo.f_jsjsrq ('2019-02-01',16)

 

原文链接:http://www.cnblogs.com/RainHouse/p/10509796.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号