我有一个数据库,其中包含有关以下格式的员工病假信息(示例):
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
感谢您的支持,
预先感谢
答案 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;
与“连续日”无关。但是您的样本数据甚至不会连续两天显示相同的登录信息-甚至也不会显示过去两个月内的任何日期。