SQL 计算某月工作日数量

SQL 计算某月工作日数量

在实际业务中,经常需要计算某个月份的工作日数量(即除去周六和周日的天数)。以下是一个完整的解决方案,基于 Oracle SQL 实现。

1. 需求分析

给定一个年份和月份(如 2020-02),计算该月份的工作日数量。

分析步骤:

  1. 获取当月的天数

    • 使用 LAST_DAY 函数获取当月的最后一天。
    • 计算当月的天数:LAST_DAY(日期) - TO_DATE('年-月', 'yyyy-mm') + 1
  2. 获取当月的周数

    • 计算当月的周数:天数 / 7
  3. 获取当月的完整周数

    • 使用 TRUNC 函数获取完整周数:TRUNC(天数 / 7)
  4. 计算完整周的工作日数量

    • 每周有 5 个工作日:完整周数 * 5
  5. 获取剩余的不足一周的天数

    • 使用 MOD 函数获取剩余天数:MOD(天数, 7)
  6. 考虑剩余天数中的工作日

    • 判断剩余天数中有多少个工作日(需考虑月初的星期几)。
  7. 处理月初是周末的情况

    • 如果月初是周六或周日,则从下一个周一开始计算。

2. 实现代码

以下是完整的 SQL 实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
SELECT 
CASE
-- 判断月初是否是周末
WHEN TO_CHAR(TO_DATE('2020-02', 'yyyy-mm'), 'dy') IN ('星期日', '星期六') THEN
-- 如果月初是周末,从下一个周一开始计算
(TRUNC((LAST_DAY(TO_DATE('2020-02', 'yyyy-mm')) -
NEXT_DAY(TO_DATE('2020-02', 'yyyy-mm'), '星期一') + 1) / 7) * 5)
+
-- 处理剩余天数
(DECODE(MOD((LAST_DAY(TO_DATE('2020-02', 'yyyy-mm')) -
NEXT_DAY(TO_DATE('2020-02', 'yyyy-mm'), '星期一') + 1), 7),
6, 5, -- 如果剩余天数为 6,则工作日为 5
MOD((LAST_DAY(TO_DATE('2020-02', 'yyyy-mm')) -
NEXT_DAY(TO_DATE('2020-02', 'yyyy-mm'), '星期一') + 1), 7)))
ELSE
-- 如果月初不是周末,直接计算
TRUNC(((LAST_DAY(TO_DATE('2020-02', 'yyyy-mm')) -
TO_DATE('2020-02', 'yyyy-mm')) + 1) / 7) * 5
+
-- 处理剩余天数
(DECODE(MOD(((LAST_DAY(TO_DATE('2020-02', 'yyyy-mm')) -
TO_DATE('2020-02', 'yyyy-mm')) + 1), 7),
6, 5, -- 如果剩余天数为 6,则工作日为 5
MOD(((LAST_DAY(TO_DATE('2020-02', 'yyyy-mm')) -
TO_DATE('2020-02', 'yyyy-mm')) + 1), 7)))
END AS 工作日数量
FROM DUAL;

3. 代码解析

(1)判断月初是否是周末

1
WHEN TO_CHAR(TO_DATE('2020-02', 'yyyy-mm'), 'dy') IN ('星期日', '星期六') THEN
  • 使用 TO_CHAR 函数获取月初的星期几。
  • 如果月初是周六或周日,则进入特殊处理逻辑。

(2)从下一个周一开始计算

1
NEXT_DAY(TO_DATE('2020-02', 'yyyy-mm'), '星期一')
  • 使用 NEXT_DAY 函数找到下一个周一的日期。

(3)计算完整周的工作日数量

1
TRUNC((LAST_DAY(日期) - NEXT_DAY(日期, '星期一') + 1) / 7) * 5
  • 计算从下一个周一开始到月末的天数。
  • 使用 TRUNC 函数获取完整周数,并乘以 5(每周 5 个工作日)。

(4)处理剩余天数

1
DECODE(MOD(剩余天数, 7), 6, 5, MOD(剩余天数, 7))
  • 使用 MOD 函数获取剩余天数。
  • 如果剩余天数为 6,则工作日为 5;否则为剩余天数。

(5)如果月初不是周末

1
TRUNC(((LAST_DAY(日期) - TO_DATE('年-月', 'yyyy-mm')) + 1) / 7) * 5
  • 直接计算从月初到月末的完整周数,并乘以 5。

4. 示例运行

输入:

  • 年份和月份:2020-02

输出:

  • 工作日数量:20

SQL 计算某月工作日数量
https://blog.pangcy.cn/2018/09/07/数据库相关/Oracle/SQL 语法/SQL 计算某月工作日数量/
作者
子洋
发布于
2018年9月7日
许可协议