社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
最近在做请假单,请假时长需要去掉法定假日和公休假,法定假日我不会算网上也没找到类似的资料。
所以我打算创建一个表,自动根据年份条件生成公休假,然后手动编辑添加法定假日。
然后再用它去关联请假数据得出实际请假时长。
下面就是根据年份生成的公休假日期。
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
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!