SQL工作日計算不含規定假日

2021-03-04 04:36:42 字數 4773 閱讀 8726

/*因為工作中乙個奇怪的需求,要用sql語言計算兩個日期間有多少個工作日。

設定是乙個星期有5個工作日,從星期一到星期五

說明:第乙個星期的工作日數:datepart(dw, @begdt)-datepart(dw, @begdt),最少0天

末乙個星期的工作日數:datepart(dw, @enddt),最多5天

計算方法:

如果兩個日期處在同乙個星期內,直接計算「第乙個星期的工作日數」

否則按下面的公式計算

(兩個日期間的總天數 - 第乙個星期的天數 - 末乙個星期的天數) / 7 * 5

+ 第乙個星期的工作日數

+ 末乙個星期的工作日數

*/--計算並返回兩個日期間的工作小時數(工作日*8)按周一到周五計算

--必須先set datefirst 1

alter function dbo.calcworkhours(@bdate datetime, @edate datetime)

returns integer

/*因為工作中乙個奇怪的需求,要用sql語言計算兩個日期間有多少個工作日。

設定是乙個星期有5個工作日,從星期一到星期五

說明:第乙個星期的工作日數:datepart(dw, @begdt)-datepart(dw, @begdt),最少0天

末乙個星期的工作日數:datepart(dw, @enddt),最多5天

計算方法:

如果兩個日期處在同乙個星期內,直接計算「第乙個星期的工作日數」

否則按下面的公式計算

(兩個日期間的總天數 - 第乙個星期的天數 - 末乙個星期的天數) / 7 * 5

+ 第乙個星期的工作日數

+ 末乙個星期的工作日數

計算方法補充:

首先按照正常計算出除週末的工作日

-減去周一到周五休假

+加上週末上班(如果結束時間為週日)就減去1天

算頭不算尾

*/--計算並返回兩個日期間的工作小時數(工作日*8)按周一到周五計算

--必須先set datefirst 1

as begin

declare @hours integer

if @@datefirst <> 1 or @bdate > @edate

return -1

select @hours =

--如果終止日期與起始日期在同乙個星期內,只需要計算有幾天即可

case when datepart(wk, @edate-1)-datepart(wk,@bdate) = 0 then

case when datepart(dw, @bdate) > 5 then 0

when datepart(dw, @edate-1) > 5 then 6 - datepart(dw, @bdate)

else datepart(dw, @edate-1) - datepart(dw, @bdate) + 1 end

--如果終止日期與起始日期在不同的星期內

--首先計算出除前後兩個星期外完整的星期數 * 5

else (datediff(dd,@bdate,@edate)

- (8-datepart(dw, @bdate))

- datepart(dw, @edate-1)) / 7 * 5

--再加上第乙個星期裡的工作日數

+ case when datepart(dw, @bdate) < 6 then 6 - datepart(dw, @bdate)

else 0 end

--加上末乙個星期裡的工作日數

+ case when datepart(dw, @edate-1)>5 then 5 else datep

art(dw, @edate-1) end

end * 8

--減去周一到周五應上班但休息

-(select count(*)*8 from 休假日期 where 狀態='休' and 開始時間 between @bdate and @edate)

--加上周

六、週日應休息但上班,如果最後一天為週日不計算

+(select case when datepart(dw, @edate)=7 then (count(*)-1)*8 else count(*)*8 end from 休假日期 where 狀態='上' and 開始時間 between @bdate and @edate)

return @hours

endcreate function dbo.calcworkhours_temp(@bdate datetime, @edate datetime)

returns integer

/*因為工作中乙個奇怪的需求,要用sql語言計算兩個日期間有多少個工作日。

設定是乙個星期有5個工作日,從星期一到星期五說明:

第乙個星期的工作日數:datepart(dw, @begdt)-datepart(dw, @begdt),最少0天末乙個星期的工作日數:datepart(dw, @enddt),最多5天計算方法:

如果兩個日期處在同乙個星期內,直接計算「第乙個星期的工作日數」

否則按下面的公式計算

(兩個日期間的總天數 - 第乙個星期的天數 - 末乙個星期的天數) / 7 * 5

+ 第乙個星期的工作日數

+ 末乙個星期的工作日數計算並返回兩個日期間的工作小時數(工作日*8)按周一到周五計算

--必須先set datefirst 1

as begin

declare @hours integer

if @@datefirst <> 1 or @bdate > @edate

return -1

select @hours =

--如果終止日期與起始日期在同乙個星期內,只需要計算有幾天即可

case when datepart(wk, @edate-1)-datepart(wk,@bdate) = 0 then

case when datepart(dw, @bdate) > 5 then 0

when datepart(dw, @edate-1) > 5 then 6 - datepart(dw, @bdate)

else datepart(dw, @edate-1) - datepart(dw, @bdate) + 1 end

--如果終止日期與起始日期在不同的星期內

--首先計算出除前後兩個星期外完整的星期數 * 5

else (datediff(dd,@bdate,@edate)

- (8-datepart(dw, @bdate))

- datepart(dw, @edate-1)) / 7 * 5

--再加上第乙個星期裡的工作日數

+ case when datepart(dw, @bdate) < 6 then 6 - datepart(dw, @bdate)

else 0 end

--加上末乙個星期裡的工作日數

+ case when datepart(dw, @edate-1)>5 then 5 else datepart(dw, @edate-1) end

end * 8

--減去周一到周五應上班但休息

---(select count(*)*8 from 休假日期 where 狀態='休' and 開始時間 between @bdate and @edate)

--加上周

六、週日應休息但上班

--+(select count(*)*8 from 休假日期 where 狀態='上' and 開始時間 between @bdate and @edate)

return @hours

endselect *,dbo.calcworkhours(生產部送審時間,審計部審結返還時間)/8 fro

rom [2023年熱季檢修專案預算審計時間表]

select * from 休假日期

select dbo.calcworkhours_temp('2013-6-5','2013-6-9')/8

select (dbo.calcworkhours_temp('2013-6-5','2013-6-9')

-(select count(*)*8 from 休假日期 where 狀態='休' and 開始時間 between '2013-6-5' and '2013-4-8')

+(select case when datepart(dw, '2013-6-9')=7 then (count(*)-1)*8 else count(*)*8 end from 休假日期 where 狀態='上' and 開始時間 between '2013-6-5' and '2013-6-9')

)/8select case when datepart(wk, '2013-6-9')=7 then (count(*)-1)*8 else count(*)*8 end from 休假日期 where 狀態='上' and 開始時間 between '2013-6-5' and '2013-6-9'

select * from 休假日期 where 狀態='上' and 開始時間 between '2013-6-5' and '2013-6-9'

select datepart(dw, '2013-6-9表結構

/*狀態:休(周一到周五上班但放假)

上(週六到週日放假但上班)

假期名稱開始時間狀態備註清明節 4月4日休清明節 4月5日休清明節 4月7日上週日上班勞動節 4月27日上週六上班勞動節 4月28日上週日上班勞動節 4月29日休勞動節 4月30日休勞動節 5月1日休端午節 6月8日上週六上班端午節 6月9日上週日上班端午節 6月10日休端午節 6月11日休端午節 6月12日休*/

工作日總結

總結相對於師姐們來說,我們每天的工作內容尤為輕鬆。看著師姐們忙碌的身影和那響不停的 聲,真覺得我們慚愧不已。作為乙個業務資訊員來說,或許我們每天的工作方式跟一般的業務員來說有點不同。我們主要是通過 來了解船舶的動態,以至於跟進我們的業務。今天的計畫和昨天的差不多,主要是跟進小船和成品油船。可能是前兩...

病床工作日

反映醫院工作質量指標之一。指每一張床在一定時期內平均工作的日數,用以衡量病床的利用情況 平均病床工作日 天 每一病人占用病床一天,為乙個病床工作日,包括臨時加床的占用床日在內。平均病床工作日如超過期內日曆天數,說明固定開放病床數不能適應實際需要而經常增加臨時床。此指標如過低於期內日曆天數,則反映病床...

工作日寫實型別

工作日寫實根據觀察物件和目的的不同可分為五種,即個人工作日寫實 工組工作日寫實 多工具機看管工作日寫實 自我工作日寫實和特殊工作日寫實。1 個人工作日寫實 以某一作業者為物件,由觀察人員實施的工作日寫實。個人工作日寫實的目的側重於調查工時利用,確定定額時間,總結先進工作方法和經驗等。2 工組工作日寫...