MySQL函数查找两个日期之间的工作日数

新手上路,请多包涵

Excel 具有 NETWORKDAYS() 函数,可查找两个日期之间的工作日数。

有人对 MySQL 有类似的功能吗?由于假期增加了复杂性,因此解决方案不必处理假期。

原文由 Yada 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 889
2 个回答

这个表达——

 5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400012345001234550', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)

计算开始日期@S 和结束日期@E 之间的工作日数。

假设结束日期 (@E) 不早于开始日期 (@S)。与 DATEDIFF 兼容,因为相同的开始日期和结束日期给出了零个工作日。忽略节假日。

数字串的构造如下。创建一个开始日期和结束日期的表,行必须从星期一开始(WEEKDAY 0),列也必须从星期一开始。从左上角到右下角的对角线全部填0(即周一到周一、周二到周二等有0个工作日)。对于每一天,从对角线开始(必须始终为 0)并填写右侧的列,一次一天。如果您登陆周末(非工作日)列,则工作日数不会改变,它是从左侧开始的。否则,工作日数增加一。当您到达行的末尾时,循环回到同一行的开头并继续,直到您再次到达对角线。然后继续下一行。

例如,假设周六和周日不是工作日 -

  | M T W T F S S
-|--------------
M| 0 1 2 3 4 4 4
T| 4 0 1 2 3 3 3
W| 3 4 0 1 2 2 2
T| 2 3 4 0 1 1 1
F| 1 2 3 4 0 0 0
S| 1 2 3 4 5 0 0
S| 1 2 3 4 5 5 0

然后将表中的 49 个值连接到字符串中。

如果您发现任何错误,请告诉我。

- 编辑改进表:

  | M T W T F S S
-|--------------
M| 0 1 2 3 4 4 4
T| 4 0 1 2 3 3 3
W| 3 4 0 1 2 2 2
T| 2 3 4 0 1 1 1
F| 1 2 3 4 0 0 0
S| 0 1 2 3 4 0 0
S| 0 1 2 3 4 4 0

改进的字符串:’0123444401233334012222340111123400001234000123440’

改进的表达:

 5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400001234000123440', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)

原文由 Rodger Bagnall 发布,翻译遵循 CC BY-SA 3.0 许可协议

在 MySQL 8.x 中(长版本 - 自解释)

 WITH
    setup AS (
        SELECT ('2022-09-01') first_day, LAST_DAY('2022-09-01') last_day
    ),
    cte AS (
        SELECT s.first_day, s.last_day,
               WEEK(s.first_day) first_week, WEEK(s.last_day) last_week
            FROM setup s
    )
SELECT first_day, last_day, DATEDIFF(last_day, first_day) days_between,
       (DATEDIFF(last_day, first_day) - 2 * (last_week - first_week) + 1) workdays
    FROM cte;

简而言之:

 WITH
    cte AS (
        SELECT
            ('2022-09-01')first_day, ('2022-09-30')last_day,
            WEEK('2022-09-01') first_week, WEEK('2022-09-30') last_week
    )
SELECT (DATEDIFF(last_day, first_day) - 2 * (last_week - first_week) + 1) workdays_without_hollidays
    FROM cte;

原文由 Marek Lisiecki 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题