场景描述
已知:工作日历,
节假日:按照中国的节假日,春节、中秋节、国庆节等是不工作的;
休息日:按照中国的双休制度,周六周日也是需要休息的,弯弯周六不休息,所以要一例一休,太(台)落后了;
工作日:按照中国人的勤劳程度,有的公司周六也是要上班的,不定哪个休息日被加班了。
推算:某个时间点某天后的工作日
如:今天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来标示
声明:此文章绝对原创,转载请注明出处。