SQL 如何得到兩個日期間的工作日(附假期表)

首先,我們有這樣一張表

我們要知道兩個日期間的工作日天數,相信大家有遇到過這個噁心人的需求,所謂工作日,不簡簡單單的就是除週六日以外的日子。要考慮到節假日,國慶啊,中秋啊,最讓人頭疼的是,你根本無法掌控節假日的規律,因爲他就是無規律可言。

所以要求出工作日的天數,我們還需要一張假日表,這張表可以幫助我們分清到底那天是節假日,那天是工作日,在末尾我會附上網盤鏈接,這個表是怎麼來的大家應該都清楚,說了無規律,那麼只能人工一個個比對了。 

基本的需求就是用這兩張表關聯,求出第一張表的兩個日期間的工作日天數即可

我們可以選擇這樣,一開始我有一個思路,就是求出來日期間的所有天數,然後將此表與假期表關聯查詢假日有多少天,相減不就正確了,然後我搞了半天才發現,這個好像沒辦法關聯。。所以我們只能用第二種辦法。

 

第二種辦法,就是講第一張表拆分,就例如,將這樣的一條數據

拆分爲這樣

然後再用日期列,去關聯假日表的數據,把非工作日的去除,剩下的條數就是工作日的天數。

假日表中:

對應的三天都爲工作日,那麼最終就是這三條,最後GROUP BY id 列,求出COUNT(*),就是最後的天數,下面上代碼。

第一張日期表:[DW].[dbo].[TAB Row Data From ECC temp6]

第二章假日表:[TAB].[dbo].[holiday]

具體字段上邊都有對應,請自行更改

SELECT
	id,
	[SP PO creation Date],
	[HUB GI date],
	COUNT (*) AS COUNT
FROM
	(
		SELECT
			id,
			[SP PO creation Date],
			[HUB GI date],
			DATEADD(
				DAY,
				number,
				[SP PO creation Date]
			) AS riqi
		FROM
			[DW].[dbo].[TAB Row Data From ECC temp6] AS A
		INNER JOIN master..spt_values AS B ON DATEADD(
			DAY,
			number,
			[SP PO creation Date]
		) <= [HUB GI date]
		AND B.[type] = 'P'
		order by id,riqi
		AND NOT EXISTS (
			SELECT
				1
			FROM
				[TAB].[dbo].[holiday] b
			WHERE
				[DAY_WORK] = 2
			AND DATEADD(
				DAY,
				number,
				[SP PO creation Date]
			) = CONVERT (DATE, [DATE_ID])
		)
	) a
GROUP BY
	id,
	[SP PO creation Date],
	[HUB GI date]

 最後截圖:

接下來大家期待已久的整理出來的假期表:直接上。

鏈接:https://pan.baidu.com/s/1J9pVGX4xMbsUe69txCGg_Q 
提取碼:lhaj 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章