一、通過一個開始時間、結束時間計算出一個工作日天數(不包含工作日與節假日); 1、函數 2、存儲過程 二、通過一個開始時間、天數計算出一個結束時間(不包含工作日與節假日); 使用迴圈來實現; ...
一、通過一個開始時間、結束時間計算出一個工作日天數(不包含工作日與節假日);
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)