之前遇到的一个面试题,跟大家分享一下。
对接公司人力资源部门,需要统计连续休假超过10天的员工。
表名:xiujia
字段名: user_id , start_dt , end_dt
员工id 休假开始日期 休假结束期
这里连续休假可能有以下几种情形:
(1) 从周一休息到下周五,去掉中间的周六日,一共休假10天。
(2)员工每次请假一天,连续请10次,一共休假10天。(这里包括连续请假N次的情形)
(3)员工从周一请假到周五,然后又从下周一请到下周五,两次请假一共10天。
针对这3种情况,我们可以发现,计算请假天数的时候,要排除周六日,并且,如果两次请假中间只隔了一个周六日,也算连续请假。
首先我们考虑连续的判断,假如我们把员工请假的日期都罗列出来,按照时间排序再加个行号,用休假日期减去行号,得到的那个日期,如果是相同的,那么就是连续的。如果遇到节假日,在算行号的时候要考虑节假日,然后计算连续休假天数的时候再把这个周六起给去掉。
这个面试题,有的人看了思路也可能会很蒙,不知道怎么实现,下面直接看代码:
select user_id,date_sub(dt_id,rn) as date_diff
from (
select
aa.user_id,aa.dt_id,aa.is_weekend,aa