版权声明:如若转载,请联系作者。 https://blog.csdn.net/liu16659/article/details/82584807
Mysql 编程实战三之计算两个日期的工作日数
1.需求
求出两个日期中的工作日数。
2.实现
代码如下:
delimiter //
drop procedure if exists getworkdays;
create procedure getWorkDays(s datetime,e datetime)
begin
select (floor(days/7)*5
+ days%7
- case when 6 between wd and wd+days%7-1 then 1 else 0 end
- case when 7 between wd and wd+days%7-1 then 1 else 0 end) as result
from
(select datediff(e,s)+1 as days, weekday(s)+1 as wd ) as a;
end //
delimiter ;
3.执行结果
mysql> call getworkdays('2018-09-02','2018-09-09');
+--------+
| result |
+--------+
| 5 |
+--------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
- 查看日历验证
4.代码分析
- 编写存储过程,便于测试。存储过程命名为
getWorkDays(d1,d2)
- 先求出日期d1到d2之间的天数days【使用
datediff()
函数】,再求出d2所在的日期为星期几【使用weekday()
函数】 - 使用floor()函数求出days中所包含的星期数为
(floor(days/7))
,那么工作日数就是floor(days/7)*5
。 - 最后一步就是求出零散的工作日:
days%7
表示的是,当前日期被7整除后的余数,这个余数就是代表零散的天数。但是我们不能将这个零散的天数全部加上,因为这个零散的天数中可能包含着周六,周末。这就是为什么我们前面计算d2是星期几的原因。 - 针对上述问题,后面再接上
case when()
语句,其中的between wd and wd+days%7-1
意思就是指周六或者周末是不是在多出来的这个零散日期里。【需要注意这里的wd
是weekday(s)
即开始时间的星期,笔者在这个位置坑了好久!!】