如何计算请假时长
1.场景
自定义设置节假日、请假类型、请假单位,自动计算请假时长
2.方案总览
2.1.自定义请假规则
在“请假规则”段落中自定义设置对应的请假规则(字段不可隐藏,如不希望保留相关字段,可将相应数字在【请假时长(分钟)】字段的公式中进行相应的替换)
方案默认请假规则:工作时间段“9:30-12:30,13:30-18:30”,请假单位为半小时(30分钟)

2.2.自定义休假制度
方案默认设置为双休制度,可通过函数NETWORKDAYS自定义休假制度,准确计算请假时长
"1000001":7个字符分别对应从周日开始的一周7天,"1"代表休息日,"0"代表工作日

2.3.维护节假日数据
每年定期维护节假日的放假日期和调休日期(支持批量导入),计算请假时长时计算当中包含的节假日和调休日

2.4.填写请假申请

3.搭建步骤
3.1.节假日管理

【假期名称】:单行文字
【日期类型】:单项选择
【放假日期】【调休日期】:日期
【是否原本为工作日】:数字-设置公式
NETWORKDAYS:返回两个日期之间的工作日数(开始日期,结束日期,"1000001")
"1000001"表示什么意思:每个字符表示一周中的一天(从周日开始),共七个字符,其中用0表示工作日,用1表示休息日。"1000001"表示周六和周日为休息日,即双休;如为单休,"1000000",周天为休息日,"0000001",周六为休息日
设置意义:判断放假这一天原本是否为工作日

3.2.请假申请
【申请人】:成员-动态-当前用户

【所属部门】:部门-动态-当前部门

【申请日期】:日期-设置公式
CURDATE:返回当前日期

【请假类型】:下拉选择

【开始请假时间】【结束请假时间】:日期
显示格式:年-月-日 时:分

【节假日天数(原为工作日)】:数据关联-聚合方式“计数”
设置意义:如果请假时间段中包含法定节假日,请假时长的计算方式是除去单休/双休等模式后的工作日天数-这些天数中的法定节假日天数,因此需要统计的是原本应为工作日的法定节假日天数
关联「节假日管理」应用中的字段【放假日期】
筛选条件:放假日期>=开始请假时间[且]放假日期<=结束请假时间[且]是否原本为工作日==1(1表示是工作日),筛选处于请假时间段的放假日期且放假日期原本应为工作日
聚合方式:计数(符合筛选条件的数据有多少条,即有多少天原为工作日的节假日)

【调休天数】:数据关联-聚合方式“计数”
设置意义:如果请假时间段中包含调休,计算请假时长时需要加上包含的调休天数
关联「节假日设置」应用中的字段【调休日期】
筛选条件:调休日期>=开始请假时间[且]调休日期<=结束请假时间,筛选处于请假时间段的调休日期
聚合方式:计数(符合筛选条件的数据有多少条,即有多少天调休)

【请假时长(分钟)】:数字-设置公式
请假时间跨越的工作日天数转换为分钟-第一天和最后一天中多计算的请假时长(分钟)
如请假时间:7/26 10:30~7/29 14:00,跨越了4个工作日,需要将7/26的9:30-10:30的一个小时,和7/29的14:00-18:30的四个半小时,全部转换为分钟后从4个整天中减去
计算步骤:
1、计算请假时间跨越的工作日天数
a、先计算工作日的天数
NETWORKDAYS(开始请假时间,结束请假时间,"1000001")
如果不是双休,可以自定义休假时间,如周日单休为"1000000",7个字符对应周日开始的一周7天,1为休息日,0位工作日
b、将(请假时间段中的工作日天数-当中的法定节假日天数+调休天数),计算出实际的工作天数,再乘以*每天的工作时间换算为分钟
(NETWORKDAYS(开始请假时间,结束请假时间,"1000001")-NUM(节假日天数(原为工作日))+NUM(调休天数))*每天工作小时数*60
2、计算开始请假时间和开始上班时间相差的工作时间(换算为分钟)
分为3种情况,用IFS:
1>开始请假时间为上午
a、先判断是否为上午时间,如果上午结束上班时间比开始请假时间晚,即为上午
是和开始请假这一天的上午结束上班时间进行比较,因此先计算这一天的上午结束上班时间:
DATE(YEAR(开始请假时间),MONTH(开始请假时间),DAY(开始请假时间),上午结束上班时间(时),上午结束上班时间(分))
上午结束上班时间比开始请假时间晚:
DAYS(DATE(YEAR(开始请假时间),MONTH(开始请假时间),DAY(开始请假时间),上午结束上班时间(时),上午结束上班时间(分)),开始请假时间)>=0
b、将开始请假时间和开始上班时间都转为时间戳后相减/60000,换算为分钟
(NUM(DATETOTIMESTAMP(开始请假时间))-NUM(DATETOTIMESTAMP(DATE(YEAR(开始请假时间),MONTH(开始请假时间),DAY(开始请假时间),上午开始上班时间(时),上午开始上班时间(分)))))/60000
2>开始请假时间为午休
a、先判断是否为午休时间,如果处于上午结束上班和下午开始上班的中间段的时间,即为午休
AND(
DAYS(开始请假时间,DATE(YEAR(开始请假时间),MONTH(开始请假时间),DAY(开始请假时间),上午结束上班时间(时),上午结束上班时间(分)))>0,
DAYS(DATE(YEAR(开始请假时间),MONTH(开始请假时间),DAY(开始请假时间),下午开始上班时间(时),下午开始上班时间(分)),开始请假时间)>0)
b、开始请假时间和开始上班时间相差的工作时间,就是上午的工作时长
3>开始请假时间为下午
a、先判断是否为下午时间,如果开始请假时间比下午开始上班时间晚,即为下午
DAYS(开始请假时间,DATE(YEAR(开始请假时间),MONTH(开始请假时间),DAY(开始请假时间),下午开始上班时间(时),下午开始上班时间(分)))>=0
b、将开始请假时间和开始上班时间都转为时间戳后相减/60000,换算为分钟,再减去中午午休的时长
(NUM(DATETOTIMESTAMP(开始请假时间))-NUM(DATETOTIMESTAMP(DATE(YEAR(开始请假时间),MONTH(开始请假时间),DAY(开始请假时间),上午开始上班时间(时),上午开始上班时间(分)))))/60000-午休时长(分)
3、计算结束请假时间和下班时间相差的工作时间(换算为分钟)
分为3中情况,用IFS:
1>结束请假时间为上午
a、先判断是否为上午时间,如果上午结束上班时间比结束请假时间晚,即为上午
DAYS(DATE(YEAR(结束请假时间),MONTH(结束请假时间),DAY(结束请假时间),上午结束上班时间(时),上午结束上班时间(分)),结束请假时间)>=0
b、将结束请假时间和下班时间都转为时间戳后相减/60000,换算为分钟,再减去中午午休时长
(NUM(DATETOTIMESTAMP(DATE(YEAR(结束请假时间),MONTH(结束请假时间),DAY(结束请假时间),下午结束上班时间(时),下午结束上班时间(分))))-NUM(DATETOTIMESTAMP(结束请假时间)))/60000-午休时长(分)
2>结束请假时间为午休
a、先判断是否为午休时间,如果处于上午结束上班和下午开始上班的中间段的时间,即为午休
AND(
DAYS(结束请假时间,DATE(YEAR(结束请假时间),MONTH(结束请假时间),DAY(结束请假时间),上午结束上班时间(时),上午结束上班时间(分)))>0,
DAYS(DATE(YEAR(结束请假时间),MONTH(结束请假时间),DAY(结束请假时间),下午开始上班时间(时),下午开始上班时间(分)),结束请假时间)>0)
b、结束请假时间和下班时间相差的工作时间,就是下午的工作时长
3>结束请假时间为下午
a、先判断是否为下午时间,如果结束请假时间比下午开始上班时间晚,即为下午
DAYS(结束请假时间,DATE(YEAR(结束请假时间),MONTH(结束请假时间),DAY(结束请假时间),下午开始上班时间(时),下午开始上班时间(分)))>=0
b、将下班时间和结束请假时间都转为时间戳后相减/60000,换算为分钟
(NUM(DATETOTIMESTAMP(DATE(YEAR(结束请假时间),MONTH(结束请假时间),DAY(结束请假时间),下午结束上班时间(时),下午结束上班时间(分))))-NUM(DATETOTIMESTAMP(结束请假时间)))/60000
将以上公式合并后,(工作日天数-节假日天数+调休天数)*每天工作时长*60-IFS(开始请假时间是上午,相差时长,是午休,相差时长,是下午,相差时长)-IFS(结束请假时间是上午,相差时长,是午休,相差时长,是下午,相差时长)
还需要考虑请假单位,将上方公式最终计算出的请假时长(分钟)/请假单位(分钟),向上取整数后再乘以*请假单位(分钟)
ROUNDUP(请假时长(分钟)/请假单位(分钟),0)*请假单位(分钟)
【请假时长(天)】:数字-设置公式
分钟转换为天

【请假规则】:段落
段落中的字段:数字
如果不希望保留段落中的这些字段,可在【请假时长(分钟)】字段的公式中进行相应数字的替换
