计算员工错过工作的天数

时间:2018-01-18 14:59:25

标签: mysql

我有一个存储员工信息的表格,其中一个字段是日期。我想创建一个查询,返回他们错过的天数,不包括周末。例如,日期格式为'2018-1-1',连续天数为'2018-1-2','2018-1-3',如果下一记录为'2018-1-5',则计数将增加因为2018-1-4是星期四,他们应该有一天的记录。

关于如何做到这一点的任何想法?

到目前为止我所拥有的:

SELECT * FROM `time` where name like 'John' AND DayOfWeek(Date) not like 7 
and dayofweek(Date) not like 1  
ORDER BY `time`.`Date`  ASC

这给了我约翰的所有记录,不包括星期六和星期日。我现在要做的是以某种方式找到记录在工作日的日期之间的差距。例如,连续几天将是'2018-1-2','2018-1-3',如果下一个记录是'2018-1-5',那么计数将增加1,因为2018-1-4是一个星期四

1 个答案:

答案 0 :(得分:1)

为了实现这一目标,您需要一个帮助程序表,这对于许多其他目的也很有用:一个表有一列自然数从0开始到一些大 n 的表。您可以像这样创建它:

create table nums (i int);
insert into nums values (0), (1), (2), (3);
insert into nums select i+4 from nums;
insert into nums select i+8 from nums;
insert into nums select i+16 from nums;
insert into nums select i+32 from nums;
insert into nums select i+64 from nums;
insert into nums select i+128 from nums;
insert into nums select i+256 from nums;

您可以通过添加类似的insert语句来查看如何将记录数量加倍,但这将生成512条记录,这足以满足您的需要。

然后您可以使用此查询来回答您的问题:

SELECT ref_date
FROM   (
         SELECT date_add('2018-01-01', interval i day) ref_date
         FROM   nums
       ) calendar
WHERE  ref_date <= curdate()
AND    dayofweek(ref_date) not in (1, 7)
AND    ref_date NOT IN (
         SELECT Date
         FROM   `time`
         WHERE  name = 'John'
       )

另见SQLfiddle