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

  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)

SQL Server函数与存储过程 计算时间的更多相关文章

  1. Sql Server函数全解<四>日期和时间函数

    原文:Sql Server函数全解<四>日期和时间函数   日期和时间函数主要用来处理日期和时间值,本篇主要介绍各种日期和时间函数的功能和用法,一般的日期函数除了使用date类型的参数外, ...

  2. SQL SERVER 函数大全[转]

    SQL Server 函数大全 一旦成功地从表中检索出数据,就需要进一步操纵这些数据,以获得有用或有意义的结果.这些要求包括:执行计算与数学运算.转换数据.解析数值.组合值和聚合一个范围内的值等. 下 ...

  3. 理解性能的奥秘——应用程序中慢,SSMS中快(2)——SQL Server如何编译存储过程

    本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(1)--简介 本文介绍SQL Server如何编译存储过程并使用计划缓存 ...

  4. 【转载】SQL SERVER 函数大全

    SQL Server 函数大全 一旦成功地从表中检索出数据,就需要进一步操纵这些数据,以获得有用或有意义的结果.这些要求包括:执行计算与数学运算.转换数据.解析数值.组合值和聚合一个范围内的值等. 下 ...

  5. sql server 函数的自定义

    创建用户定义函数.这是一个已保存 Transact-SQL 或公共语言运行时 (CLR) 例程,该例程可返回一个值.用户定义函数不能用于执行修改数据库状态的操作.与系统函数一样,用户定义函数可从查询中 ...

  6. SQL Server基础之存储过程

      简单来说,存储过程就是一条或者多条sql语句的集合,可视为批处理文件,但是其作用不仅限于批处理.本篇主要介绍变量的使用,存储过程和存储函数的创建,调用,查看,修改以及删除操作. 一:存储过程概述 ...

  7. 【SQL Server】SQL Server基础之存储过程

    SQL Server基础之存储过程  阅读目录 一:存储过程概述 二:存储过程分类 三:创建存储过程 1.创建无参存储过程 2.修改存储过程 3.删除存储过程 4.重命名存储过程 5.创建带参数的存储 ...

  8. (转)SQL Server基础之存储过程(清晰使用)

    阅读目录 一:存储过程概述 二:存储过程分类 三:创建存储过程 1.创建无参存储过程 2.修改存储过程 3.删除存储过程 4.重命名存储过程 5.创建带参数的存储过程   简单来说,存储过程就是一条或 ...

  9. Sql Server数据库之存储过程

    阅读目录 一:存储过程概述 二:存储过程分类 三:创建存储过程 1.创建无参存储过程 2.修改存储过程 3.删除存储过程 4.重命名存储过程 5.创建带参数的存储过程   简单来说,存储过程就是一条或 ...

随机推荐

  1. 数据结构(C++)之Double Linked List实践

    //double linked list (type int),the position starts from 0 #include <iostream> using namespace ...

  2. [ SSH框架 ] Spring框架学习之二(Bean的管理和AOP思想)

    一.Spring的Bean管理(注解方式) 1.1 什么是注解 要使用注解方式实现Spring的Bean管理,首先要明白什么是注解.通俗地讲,注解就是代码里的特殊标记,使用注解可以完成相应功能. 注解 ...

  3. SSM框架+MySql保存emoji表情

    本博客的记录的操作在linux 项目中需要从微信获取授权来登录,在此过程,保存微信emoji表情昵称到mysql数据库的时候出了错误. 老规矩百度一下,得知是mysql的utf8字符集只支持1-3个字 ...

  4. HTTP Strict Transport Security实战详解

    HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式. 0×01. Freebuf百科: ...

  5. underscore源码阅读

    1:函数式编程初探 2:if(obj.length === +obj.length)的判断 3:JS对象属性用中括号表示的优点在于可以用变量表示属性 4:callee,caller---JS高级程序设 ...

  6. textarea去掉右下角拖拽

    /*去掉textarea右下角三角符号*/ resize : none;

  7. 7. 整合shiro,搭建粗粒度权限管理

    shiro是一个易用的权限管理框架,只需提供一个Realm即可在项目中使用,本文就将结合上一篇中搭建的权限模块.角色模块和用户模块来搭建一个粗粒度的权限管理系统,具体如下:1. 添加shiro依赖和与 ...

  8. java正则使用方法

    import java.util.regex.Matcher;import java.util.regex.Pattern; public class RegexMatches{    public ...

  9. Axure使用——创建折叠菜单

    1.先添加动态面板 2.往动态面板中添加矩形 3.接着先隐藏下面的矩形(也就是你要折叠起来的内容) 4.一定要注意: 5.添加动态面板的状态 6.把之前做的那个矩形全部复制到state1中 7.把之前 ...

  10. 钉钉机器人zabbix报警

    首先在钉钉群聊里添加一个自定义的机器人 并复制webhook的内容 https://oapi.dingtalk.com/robot/send?access_token=37e23308d1b84eb4 ...