如何计算两个日期之间的工作天数

大家好,才是真的好。

很多人觉得,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语句即可。

不过今天我们就讲到这里吧。

更多精彩内容,请关注微信公众号:协作者

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值