sql 計算法定假節假日解決方案一

最近在做請假單,請假時長需要去掉法定假日和公休假,法定假日我不會算網上也沒找到類似的資料難過

所以我打算創建一個表,自動根據年份條件生成公休假,然後手動編輯添加法定假日。

然後再用它去關聯請假數據得出實際請假時長。


下面就是根據年份生成的公休假日期。

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

這是每條記錄關聯出來的請假時段中包含公休假和法定假的詳細記錄,然後根據條件進行統計就是了。



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