SQL Server函數與存儲過程 計算時間
一、通過一個開始時間、結束時間計算出一個工作日天數(不包含工作日與節假日);
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)
原文位址
https://www.cnblogs.com/RainHouse/p/10509796.html