我有一个存储员工信息的表格,其中一个字段是日期。我想创建一个查询,返回他们错过的天数,不包括周末。例如,日期格式为'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是一个星期四
答案 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'
)