计算一段日期内的应出勤天数是工作中经常遇到的问题, 不仅需要考虑周末, 还要考虑国家的法定节假日和调休等.
在日常的工作中有以下四种情况:
- 1 双休, 不考虑节假日和调休
- 2 双休, 考虑节假日, 但不考虑调休
- 3 单休, 不考虑法定节假日和调休
- 4 双休或单休, 考虑法定节假日和调休
为了计算上面的四种情况, 需要用到Excel中的两个函数: NETWORKDAYS和NETWORKDAYS.INTL. 接下来首先介绍四种情况的解决方法, 最后介绍两个函数的详细使用方法.
1 双休, 不考虑节假日和调休
这种情况下, 所有的周六和周日都是休息日, 除周六和周日外的日期都是正常工作日. 这时可以使用NETWORKDAYS函数可以解决.
NETWORKDAYS的使用方法是: NETWORKDAYS(start_date, end_date, [holidays])
, 函数包含三个参数:
- start_date, 必选参数, 表示开始日期;
- end_date, 必选参数, 表述结束日期;
- holidays, 可选参数, 表示节假日
计算示例如下
- 计算
2018-12-03~2018-12-31
之间的工作日天数, 就可以使用公式NETWORKDAYS("2018-12-3", "2018-12-31")
. - 针对单元格的计算如下图所示.
C2
单元格的工作日天数的计算公式是NETWORKDAYS(A2,B2)
, 其中A2
和B2
分别表示开始日期和结束日期,
- 计算给定日期所在月份剩余的工作日天数:
NETWORKDAYS(A2,DATE(YEAR(A2),MONTH(A2)+1,))
, 其中A2
单元格表示日期,DATE(YEAR(A2),MONTH(A2)+1,)
用于计算该月的最后一天(如2018-12-3, 12月的最后一天是2018-12-31)
2 双休, 考虑节假日, 但不考虑调休
这种情况下所有的周末和指定的节假日是休息日, 其余时间为正常的工作日, 示例如下: C2
单元格的计算公式为: NETWORKDAYS(A2,B2,$E$2:$E$6)
, 其中A2
和B2
分别表示开始日期和结束日期, 第三个参数$E$2:$E$6
表示法定节假日.
3 单休, 不考虑法定节假日和调休
单休的情况下就不能使用NETWORKDAYS
函数了, 需要使用另外一个函数NETWORKDAYS.INTL
, 该函数包括四个参数, 分别是:
- start_date, 必选参数, 表示开始日期;
- end_date, 必选参数, 表示结束日期;
- weekend, 可选参数, 表示一周中哪些天是周末, 哪些天是工作日. 使用一个由0,1组成的字符串表示, 0表示工作日, 1表示周末, 如每周双休可以表示为: "0000011", 周日单休可以表示为: "0000001".
- holidays, 可选参数, 表示节假日, 可以自定义节假日.
根据NETWORKDAYS.INTL函数的定义我们可以得到此种情况的解决方案, 需要使用前三个参数. 示例如图所示:
其中前两个参数A2
和B2
分别表示开始和结束日期, 第三个参数"0000001"
表示每周周日是休息日, 其他是工作日. 工作日天数的计算公式就是: =NETWORKDAYS.INTL(A2,B2,"0000001")
4 双休或单休, 考虑法定节假日和调休
这种情况是最复杂的情况, 也是最常见的情况. 如果只考虑节假日, 那么我们只需要使用NETWORKDAYS
函数就可以解决. 但是涉及调休之后不行了.
所以还是需要使用NETWORKDAYS.INTL
函数, 但是需要换个思路来解决问题.
- 首先, 把一周的7天都作为正常的工作日;
- 然后, 所有的周末和法定节假日, 减去所有的调休作为节假日;
- 最后, 计算一段时间内的所有天数减去节假日的天数就是正常的工作日天数.
按照这个思路, 函数的前两个参数仍然是开始日期和结束日期, 第三个参数定义为"0000000"
, 第四个参数是所有的周末加所有的节假日, 减去调休的日期.
那么下图的例子中, 工作日天数的计算公式就是: =NETWORKDAYS.INTL(A2,B2,"0000000",$E$2:$E$116)
5 函数NETWORKDAYS详细使用方法
该函数用于计算从指定的开始日期(包含)到结束日期(包含)的工作日的天数, 工作日不包括周末和指定的节假日. 具体的使用方法如下, 详细使用方法参见官方文档
语法
NETWORKDAYS(start_date, end_date, [holidays])
该函数有三个参数, 每个参数代表的意义如下:
- Start_date, 必需参数。 一个代表开始日期的日期。
- End_date, 必需参数。 一个代表终止日期的日期。
- Holidays, 可选参数。不在工作日历中的一个或多个日期所构成的可选区域,例如:省/市/自治区和国家/地区的法定假日以及其他非法定假日。该列表可以是包含日期的单元格区域,或是表示日期的序列号的数组常量。
函数NETWORKDAYS.INTL的详细使用方法
返回两个日期之间的所有工作日数,可以使用参数指定哪天是周末(这对于单休的公司非常有用),也可以指定除周末外的其他节假日。周末和任何指定为假期的日期不被视为工作日。详细使用方法可以参考官方文档
语法
NETWORKDAYS.INTL(start_date, end_date, [weekend], [holidays])
该函数有三个参数, 每个参数的解释如下:
- **start_date 和 end_date **, 必需参数。 要计算其差值的日期。 start_date 可以早于或晚于 end_date,也可以与它相同。
- weekend 可选。 用于指定一个星期中哪些天是工作日和哪些天是周末, 有两种表示方法, 一种是使用数字来表示weekend, 另一种是使用字符串来表是
可以用下表中的数字来表示, 第一列是数字, 第二列是该数字代表的意义.
周末数 | 周末日 |
---|---|
1 或省略 | 星期六、星期日 |
2 | 星期日、星期一 |
3 | 星期一、星期二 |
4 | 星期二、星期三 |
5 | 星期三、星期四 |
6 | 星期四、星期五 |
7 | 星期五、星期六 |
11 | 仅星期日 |
12 | 仅星期一 |
13 | 仅星期二 |
14 | 仅星期三 |
15 | 仅星期四 |
16 | 仅星期五 |
17 | 仅星期六 |
字符串是长度为7的0、1组合, 0表示工作日, 1表示周末, 如"0000011"表示周一到周五是工作日, 周六和周日是周末; "0000001"表示周一到周六是工作日, 周日是休息日.
- holidays 可选。 一组可选的日期,表示要从工作日日历中排除的一个或多个日期。 holidays 应是一个包含相关日期的单元格区域,或者是一个由表示这些日期的序列值构成的数组常量。 holidays 中的日期或序列值的顺序可以是任意的。