MySQL-如何检查数据连续性

时间:2018-07-15 10:36:17

标签: mysql sql

我有一个数据库,其中包含有关以下格式的员工病假信息(示例):

date || login

2018-01-02 || TestLogin1
2018-01-03 || TestLogin2
2018-01-04 || TestLogin5
2018-01-05 || TestLogin1
2018-01-06 || TestLogin2

我想检查一下过去60天内是否连续有23个病假。

我知道如何使用循环在PHP中执行此操作,但想知道是否有可能在原始MySQL中创建此应用。

这是我要实现的输出:

login || NumberOfDaysOnSickLeaveWithinPrevious2Month

TestLogin4  || 32
TestLogin7  || 30
TestLogin12 || 20
TestLogin3  || 15
TestLogin1  || 10

感谢您的支持,

预先感谢

2 个答案:

答案 0 :(得分:1)

如果缩小数字,例如最近5天内连续2天或更长时间,则开发此方法要容易得多。

unresolved overloaded function type

+ ------------- ++ -------- + ---------- +

drop table if exists t;
create table t(employee_id int, dt date);

insert into t values
(1,'2018-07-10'),(1,'2018-07-11'),(1,'2018-07-12'),
(2,'2018-07-10'),(2,'2018-07-15'),
(3,'2018-07-10'),(3,'2018-07-11'),(3,'2018-07-13'),(3,'2018-07-14')
;

select employee_id, bn, count(*)
from
(
select t.*, concat(employee_id,year(dt) * 10000 + month(dt) * 100 + day(dt))
         - @p = 1 diff,
         if(
         concat(employee_id,year(dt) * 10000 + month(dt) * 100 + day(dt))
         - @p = 1 ,@bn:=@bn,@bn:=@bn+1) bn,
         @p:=concat(employee_id,year(dt) * 10000 + month(dt) * 100 + day(dt)) p
from t
cross join (select @bn:=0,@p:=0) b
where dt >= date_add(date(now()), interval  -5 day) 
order by employee_id,dt
) s
group by employee_id,bn having count(*)  >= 2 ;

请注意使用变量来算出程序段号和hading子句。将员工和日期放在一起可以创建伪密钥并简化计算。

答案 1 :(得分:1)

您的样本数据表明您只想聚合:

select login,
       count(*) as NumberOfDaysOnSickLeaveWithinPrevious2Month
from t
where date >= curdate() - interval 2 month
group by login;

与“连续日”无关。但是您的样本数据甚至不会连续两天显示相同的登录信息-甚至也不会显示过去两个月内的任何日期。