天数"/>
如何计算两个日期之间的工作天数
大家好,才是真的好。
很多人觉得,Notes应用中的日期处理是一大需求点,也是一大难点,为此很多人使用Java代码来进行处理。但要是学会并灵活运用Domino中的公式,很多问题会变得很简单。今天我们就来讨论两个日期之间的工作日计算问题。
在考勤类应用中,如请假表单上我们创建三个字段,现在要计算开始日期、结束日期和这两段日期之间的工作天数。
我们创建一个计算按钮,写如下图公式:
公式的具体代码如下:
Check := @If(@IsTime(StartDate) & @IsTime(EndDate); 0; @Return(0));
S := @If(StartDate < EndDate; StartDate; EndDate);
E := @If(StartDate < EndDate; EndDate; StartDate);
DiffDays := @Integer((E - S) / 86400);
WeeksBetween := @Integer(DiffDays / 7);
WS := @Weekday(S);
WE := @Weekday(E);
Adjust := @If(WS = WE; 0; WS = 1 & WE = 7; 5; WS = 7 & WE = 1;0; WE = 7 | WE = 1; 6-WS; WS = 7 | WS = 1; WE-1;WE > WS; WE-WS; 5+WE-WS);
(WeeksBetween * 5) + Adjust
解释一下,该段公式是这样执行的:
首先我们使用Check := @If(@IsTime(StartDate) & @IsTime(EndDate); 0; @Return(0));语句来确认StartDate和EndDate是一个时间日期值,因为用户输入什么值都是有可能的;
其次使用语句S := @If(StartDate < EndDate; StartDate; EndDate);
E := @If(StartDate < EndDate; EndDate; StartDate);
判断EndDate要比StartDate晚,并将这两个变量分别赋值给E和S临时变量;
接着我们使用语句DiffDays := @Integer((E - S) / 86400);比较一下StartDate和EndDate之间有多少天,再用WeeksBetween := @Integer(DiffDays / 7)来计算StartDate和EndDate之间有多少周;
然后使用WS := @Weekday(S)和WE := @Weekday(E)语句来得到StartDate 和EndDate分别是星期几;
紧接着就是重要重要的语句
Adjust := @If(WS = WE; 0; WS = 1 & WE = 7; 5; WS = 7 & WE = 1;
0; WE = 7 | WE = 1; 6-WS; WS = 7 | WS = 1; WE-1;WE > WS; WE-WS; 5+WE-WS);
设置一个调整值Adjust;Adjust的值有很多种情况,比如StartDate 和EndDate的星期几是一样的,那么Adjust就是0;如果StartDate是周日(即 WS = 1 )而EndDate是周六(WE = 7),则StartDate 和EndDate之间间隔5天;以此类推……
最后就是StartDate 和EndDate 日期之间的真正的工作天数:(WeeksBetween * 5) + Adjust;即用两个日期之间的周数加上调整值Adjust即可。
你可以计算一下,如下图:
当然,这里面你可能发现了一个问题,这里的公式计算中,开始日期和结束日期不包含一个其中,例如开始日期是4月25号,结束日期是4月26号,那么只算1个工作日,如下图:
这是个数栅栏的问题,栅栏的杆子和格子数目肯定不一样,对吧?你要是觉得开始日期和结束日期都要算上,只需要修改一下Adjust语句即可。
不过今天我们就讲到这里吧。
更多精彩内容,请关注微信公众号:协作者
更多推荐
如何计算两个日期之间的工作天数
发布评论