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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM