如何计算去除法定节假日及周末的请假天数?

1. 简介

1.1 案例简介

本文将介绍,在考勤请假的场景中,如何实现请假天数自动去除法定节假日和周末,并自动添加周末调休天数,准确计算出实际请假天数,可用于考勤计算、薪资计算等。

1.2 设计思路

1)在「法定日期记录表」中,提前录入当年所有的法定节假日日期,通过函数判断出该日期是否为周末,并添加标记;

2)在「调休日期记录表」中,提前录入当年所有的周末调休日期,并对日期添加标记;

3)在「请假申请表」中,利用 NETWORKDAYS 函数计算出请假开始日期到请假结束日期之间完整的工作日天数,扣除非周六/日的国家假日,再加上需要调休上班的日期,即计算出实际请假天数。

1.3 预期效果

以五一期间的请假为例,已知五一期间法定节假日期为~,调休日期为。如在~期间请假,则实际请假天数为 9,效果如下:

2. 设置步骤

在学习之前建议安装 请假天数计算 应用模板,本文将按照模板中的示例数据进行讲解。

2.1 表单搭建

1)新建「请假申请表」表单,字段设置如下:

字段名称

字段类型

请假开始时间

日期时间

请假结束时间

日期时间

实际请假天数

数字

子表单行数

数字

子表单

子表单

序号

子字段-单行文本

日期时间

子字段-日期时间

法定节假日判断

子字段-数字

调休判断

子字段-数字

2)新建「法定日期记录表」表单,字段设置如下:

字段名称

字段类型

日期时间

日期时间

法定节假日标记

数字

3)新建「法定日期记录表」表单,字段设置如下:

字段名称

字段类型

调休日期

日期时间

调休标记

数字

4)新建「子表单基础表」辅助表单,字段设置如下:

字段名称

字段类型

总行数

数字

子表单

子表单

序号

子字段-单行文本

数字

子字段-数字

2.2 设置辅助表单

2.2.1 法定日期记录表

法定节假日记录表中,需要提前录入当年所有的法定节假日日期,并判断该日期是否为周末。

1)选中「法定节假日标记」字段,在「字段属性 >> 默认值」处,设置默认值为「公式编辑」,点击下方「编辑公式」:

2)在公式编辑页面,设置「法定节假日标记」的公式为:IF(OR(TEXT(DATE(日期时间),'E')==0,TEXT(DATE(日期时间),'E')==6),0,1),表示当节假日的日期为星期日或星期六时,该字段标记为 0,否则标记为 1。设置好后点击确定」保存。

3)进入「数据管理」,在表单中录入当年所有的法定节假日日期:

2.2.2 调休日期记录表

调休日期记录表中,需要提前录入当年所有的调休上班日期,并为该日期添加标记,便于后续计算实际请假日期。

1)选中「调休标记」字段,在「字段属性 >> 默认值」处,设置默认值为「自定义」,在输入框中设置默认值为 1:

2)进入「数据管理」,在表单中录入当年所有的调休日期:

2.2.3 子表单基础表

1)在「子表单基础表 >> 数据管理 >> 导入」处导入附件中的示例数据:200行子表单基础表序号全集.xlsx

2)导入数据时需确认示例数据和表单字段的关联关系如下:

2.3 设置数据联动

1)进入「请假申请表」表单,选中整个「子表单」,在「字段属性 >> 默认值」处,设置选项为「数据联动」,点击「数据联动设置」:

2)进入数据联动设置页面,设置内容如下:

  • 联动表单:「子表单基础表」;
  • 条件设置为:「总行数」等于「子表单行数」;
  • 触发联动:
    • 「子表单」字段显示「子表单」字段的值;
    • 添加「序号」子字段,显示为「序号」子字段的值;

设置完成点击「确定」。

3)同理,设置「子表单.法定节假日判断」字段的数据联动如下:

  • 联动表单:「法定日期记录表」;
  • 条件设置为:「日期时间」等于「子表单.日期时间」;
  • 触发联动:「子表单--法定节假日判断」字段显示「法定节假日标记」字段的值;

设置完成点击「确定」。

4)同样的方法,设置「子表单.调休判断」字段的数据联动如下:

  • 联动表单:「调休日期记录表」;
  • 条件设置为:「日期时间」等于「子表单.日期时间」;
  • 触发联动:「子表单--调休判断」字段显示「调休标记」字段的值;

设置完成点击「确定」。

2.4 设置公式

1)进入「请假申请表」,选中「子表单行数」字段,在「字段属性 >> 默认值」处,设置默认值为「公式编辑」,点击下方「编辑公式」:

2)在公式编辑页面,设置「子表单行数」的公式为:DAYS(请假结束时间,请假开始时间)+1,用于计算从请假开始到结束一共多少天,作为子表单的行数。

设置好点击确定」保存。

3)按照同样的方法,设置其他字段的公式如下:

  • 子表单.日期时间:IF(子表单.序号=='1',请假开始时间,IF((VALUE(子表单.序号)<=子表单行数+1),DATE(YEAR(请假开始时间),MONTH(请假开始时间),DAY(请假开始时间)+VALUE(子表单.序号)-1),' ')),表示当子表单中序号为 1 时,第一行的日期为请假开始时间,后续的日期依次在前一个日期基础之上加上一天,直至子表单行数用完;
  • 实际请假天数:NETWORKDAYS(请假开始时间,请假结束时间)-SUM(子表单.法定节假日判断)+SUM(子表单.调休判断)},即计算出请假时间中除去周末的工作日天数,再加上法定节假日不在周末的天数,减去调休上班在周末的天数,最终得出实际请假天数。

2.5 设置字段显隐规则

1)对于表单中的辅助字段「子表单行数」和「子表单」,可以在「字段属性 >> 字段权限」处设置字段为不可见:

2)设置辅助字段不可见后,需在「表单属性 >> 不可见字段赋值」处,设置赋值规则为「始终重新计算」:

2.6 效果演示

效果演示参见本文【1.3 预期效果】。

Copyright(C)2023 HFBangFu Inc. All Rights Reserved 皖ICP备12017563号-5