如何获取第N个工作日 - MySQL自定义函数

生活中常常遇到“几个工作日内”给予答复。那么,我们如何通过MySQL计算最晚答复时间呢?

工作日,不只是有周一到周五,比如:2022-01-03 星期一,元旦放假;2022-10-08|09 虽然是周六周日,但也是需要补调休的算做工作日。

那么,我们要使用代码查出第N个工作日,就首先需要有一个“节假日”数据表。2022年最新的节假日SQL导入文件我已经准备好了,关注公众号,回复“22”即可获得。表格如下:

图片

我使用了我定义function的方式完成。内容如下:

CREATE FUNCTION `get_china_workday`
    (start_dt DATE, days INT) RETURNS DATE
    DETERMINISTIC
BEGIN
  DECLARE res_date DATE DEFAULT start_dt;
  DECLARE d_days INT DEFAULT 0;
  DECLARE work_flag INT;
  
  WHILE d_days < days DO
    SET work_flag = -1;
    SET res_date = DATE_ADD(res_date,INTERVAL 1 DAY);
    
    SELECT is_workday INTO work_flag FROM `holiday` WHERE dt = res_date;
    IF work_flag = -1 AND WEEKDAY(res_date) < 5 THEN
      SET d_days = d_days + 1;
    ELSEIF work_flag = 1 THEN 
      SET d_days = d_days + 1;      
    END IF;
  END WHILE;
  RETURN res_date;
END$$

函数名:get_china_workday(start_date, days)

入参:    start_date 开始日期

              days 第几天

实现思路:

        从当前时间开始,调用days次DATE_ADD(res_date,INTERVAL 1 DAY)

每增加一天,查一次holiday表,查询结果一共有三种:

  1. 查不到:代表是平常日,再确认是不是周一到周五;是则计数。

  2. 能查到,且is_workday = 0,则说明是假期,不必计数。

  3. 能查到,且is_workday = 1,则说明虽然是周末,但要补假期调休则应计数。

        直到工作日够数,返回最后日期。

测试结果:

图片

遇到的问题:

1. 参数不要和字段名重名。最开始start_dt变量名写的是dt,这与holiday表的日期字段重名了,结果在下面这条数据里,怎么也得不到正确的结果。

 WHERE dt = res_date;

2. 函数WEEKDAY(date),week(date),DAYOFWEEK(date)等相似的函数需要回顾

3. MySQL 8.0.17之后不再推荐使用FOUND_ROWS()来查看是否没有数据行。推荐使用文中方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老陈头7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值