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)

     

  • 相关阅读:
    内存管理 Autorelease、retain、copy、assign的set方法和含义?
    解决 项目cocoapods diff: /../Podfile.lock: No such file or directory
    iOS按钮点击的频率 防止按钮连续点击时重复执行按钮的点击方法
    iOS 网络篇--PDF网络文件下载和打开
    使用runtime获取属性
    取到 tableview 自定义section header 上的button
    JavaScript第一天 改变DIV的样式
    iOS 因为reason: 'Pushing the same view controller instance more than once is not supported而奔溃(下)
    iOS 因为reason: 'Pushing the same view controller instance more than once is not supported而奔溃(上)
    iOS缓存功能
  • 原文地址:https://www.cnblogs.com/RainHouse/p/10509796.html
Copyright © 2011-2022 走看看