最近在做請假單,請假時長需要去掉法定假日和公休假,法定假日我不會算網上也沒找到類似的資料。
所以我打算創建一個表,自動根據年份條件生成公休假,然後手動編輯添加法定假日。
然後再用它去關聯請假數據得出實際請假時長。
下面就是根據年份生成的公休假日期。
DECLARE @Work_LegalHoliday TABLE
(
ID VARCHAR(36) ,
DateTimeName DATETIME ,
WeekName VARCHAR(50) ,
IsLegalHoliday INT ,
Remark NVARCHAR(MAX)
)
DECLARE @Year INT
SET @Year = 2015
--
;
WITH tbSource
AS ( SELECT CAST(RTRIM(@Year) + '-01-01' AS DATETIME) DateTimeName
UNION ALL
SELECT DATEADD(dd, 1, DateTimeName)
FROM tbSource
WHERE DATEPART(yy, DATEADD(dd, 1, DateTimeName)) = @Year
)
INSERT @Work_LegalHoliday
SELECT NEWID() ,
CONVERT(VARCHAR(10), DateTimeName, 121) ,
DATENAME(WEEKDAY, DateTimeName) ,
0 ,--不是法定假日
'' AS Remark
FROM tbSource a
WHERE DATEPART(WEEKDAY, a.DateTimeName) = 1
OR DATEPART(WEEKDAY, a.DateTimeName) = 7
EXCEPT
SELECT NEWID() ,
CONVERT(VARCHAR(10), DateTimeName, 121) ,
DATENAME(WEEKDAY, DateTimeName) ,
0 ,
'' AS Remark
FROM @Work_LegalHoliday
OPTION ( MAXRECURSION 0 )
SELECT *
FROM @Work_LegalHoliday
生成結果如下:
生成這個結果後,再去編輯或添加法定假日。
然後再用請假數據關聯該表
SELECT a.ID ,
a.LeaveStartTime ,
a.LeaveEndTime ,
b.IsLegalHoliday ,
CASE WHEN b.WeekName = '星期六'
OR b.WeekName = '星期日' THEN '是'
ELSE '否'
END IsWeekend
FROM dbo.Work_Leave a
LEFT JOIN dbo.Work_LegalHoliday b ON b.DateTimeName >= a.LeaveStartTime
AND b.DateTimeName <= a.LeaveEndTime
這是每條記錄關聯出來的請假時段中包含公休假和法定假的詳細記錄,然後根據條件進行統計就是了。