根据工作日历推算工作日的算法

场景描述


已知工作日历
节假日:按照中国的节假日,春节、中秋节、国庆节等是不工作的;
休息日:按照中国的双休制度,周六周日也是需要休息的,弯弯周六不休息,所以要一例一休,太(台)落后了;
工作日:按照中国人的勤劳程度,有的公司周六也是要上班的,不定哪个休息日被加班了。
推算:某个时间点某天后的工作日
如:今天7-21星期五,1个工作日后是哪一天?
如果按照正常休息,是7-22?NO,7-22星期六,结果是7-24;
如果公司这周比较忙,周六加班,则7-22是可以上班的,结果是7-22;
假设7-22,7-23,7-24比较热,放高温假了,则结果是7-25
又如:今天是7-21星期五,去办事,公务员说等15个工作日后再来,得查下日历,说不定中间放几个节日就得两三周后了。


解题思路


首先是循环,其次是判断,最后是结果
设起点日,估算天数,是否递减标志(默认是TRUE)
先从起点日起,循环估算天数,往后累加1天,得到待估日。
判断待估日是否是周六/日(休息日),如果是则递减标志FALSE
判断待估日是否是节假日,如果是则递减标志FALSE
判断待估日是否是工作日,如果是则递减标志TRUE
判断递减标志是否为TRUE,如果TRUE,则估算天数-1,否则估算天数不变
直到循环结束,得出结果。


实现方法


DECLARE @IsMinus INT
DECLARE @Edate   DATETIME
DECLARE @DayCount INT


--是否递减标志
SET @IsMinus = 0
SET @Edate = @InputDate
--天数
SET @DayCount=XXX


WHILE (@DayCount > 0)
BEGIN
   SET @Edate = dateadd (dd, -1, @Edate)
   --默认后移
   SET @IsMinus = 1
   --如果是周六、日不后移
   IF (datepart (weekday, @Edate) = 1 OR datepart (weekday, @Edate) = 7)
      BEGIN
         SET @IsMinus = 0
      END
   --如果是节假日不后移
   IF EXISTS
         (SELECT TOP 1 DATE_TIME
            FROM dbo.SPECAL_DATE SD WITH (NOLOCK)
           WHERE SPECAL_DATE_TYPE = '节假日' AND DATE_TIME = @Edate)
      BEGIN
         SET @IsMinus = 0
      END
   --如果周六日为工作日,则后移
   IF EXISTS
         (SELECT TOP 1 DATE_TIME
            FROM dbo.SPECAL_DATE SD WITH (NOLOCK)
           WHERE SPECAL_DATE_TYPE = '工作日' AND DATE_TIME = @Edate)
      BEGIN
         SET @IsMinus = 1
      END

   IF (@IsMinus = 1)
      BEGIN
         SET @DayCount = @DayCount - 1
      END
   ELSE
      BEGIN
         SET @DayCount = @DayCount
      END
END

return @Edate

开发后记

如果直接用@DayCount判断,总计算错误,所以加入@IsMinus来标示

声明:此文章绝对原创,转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值