zoukankan      html  css  js  c++  java
  • SQL Server函数与存储过程 计算时间

    一、通过一个开始时间、结束时间计算出一个工作日天数(不包含工作日与节假日),节假日在 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)

     

  • 相关阅读:
    TortoiseGit 连接oschina不用每次输入用户名和密码的方法
    IIS7 配置SSL 绑定主机头
    二种方法安装卸载Windows服务的命令
    System.Data.SqlClient.SqlException: 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值
    SQL Server 2008 角色
    sql2008“备份集中的数据库备份与现有的xx数据库不同”解决方法
    winform窗体间传值
    C#用到的一些代码汇总,后期再整理
    排球计分程序中英文切换
    ASP.NET MVC 排球计分程序 (八)排球计分程序的演示
  • 原文地址:https://www.cnblogs.com/RainHouse/p/10509796.html
Copyright © 2011-2022 走看看