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

这是每条记录关联出来的请假时段中包含公休假和法定假的详细记录,然后根据条件进行统计就是了。



  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值