計算一段日期內的應出勤天數是工作中經常遇到的問題, 不僅需要考慮周末, 還要考慮國家的法定節假日和調休等.
在日常的工作中有以下四種情況:
- 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 中的日期或序列值的順序可以是任意的。