查找结果中缺少哪个日期

Max*_*x13 -1 mysql date

这是我的ticks(时钟)表:

_id_
#employee_id  
created_at
Run Code Online (Sandbox Code Playgroud)

该表为每个员工存储他们勾选的时间戳。有时他们中的一些人一天打好几次,有些人不上班时只打一次或根本不打。

我有一个查询,可以让我确切地知道员工在过去 7 天内不上班的次数,但我希望结果中包含他们上班的天数。这意味着,每个员工在过去 7 天内工作少于 6 天,以及缺少哪些日期。我不知道。

以下是我如何查询过去 7 天内谁缺席了不止一次,以及缺席了多少次:

SELECT `id`, `employee_id`, COUNT(`date`)-6 missing
FROM (
    SELECT `id`, `employee_id`, DATE(created_at) date
    FROM `ticks`
    WHERE `created_at` >= '2017-09-16' AND `created_at` < '2017-09-23'
    GROUP BY `employee_id`, `date`
) ticks
GROUP BY `employee_id`
HAVING missing < 0
Run Code Online (Sandbox Code Playgroud)

基于那个或另一个查询,我想知道该范围内缺少哪个日期(顺便说一下,我可以从另一个查询中获取范围,每天至少有 1 个刻度,即使是在星期日)。

这是一个带有示例数据集的sqlfiddle。我期待的结果是:

+-------------+--------------+
| employee_id | date_missing |
+-------------+--------------+
|           2 |   2017-09-18 |
|           2 |   2017-09-19 |
|           3 |   2017-09-20 |
+-------------+--------------+
Run Code Online (Sandbox Code Playgroud)

ind*_*iri 5

第一部分将生成您正在检查的日期。
第二个抓取该周内登录的所有员工。如果你有一个单独的员工表,你可以在这里替换它,这样你就会得到整周都没有登录的员工。它加入的最后一部分是您拥有的滴答声。

LIMIT 7给你一个星期。如果您想一次获得更多天数,请将这个数字调大。

WHERE ticks.date is null将只选择ticks没有记录的日子。

SELECT `dates`.`date`, `employees`.`employee_id`
FROM (
    SELECT 
    date_format(adddate('2017-09-16', @num:=@num+1), 
        '%Y-%m-%d') date
    FROM `ticks`, (select @num:=-1) num
    LIMIT 7
) dates 
CROSS JOIN (
    SELECT DISTINCT `employee_id`
    FROM `ticks`
) employees
LEFT JOIN (
    SELECT `id`, `employee_id`, DATE(created_at) date
    FROM `ticks`
) ticks 
    on dates.date = ticks.date
        and ticks.`employee_id` = employees.`employee_id`
WHERE ticks.date is null
Run Code Online (Sandbox Code Playgroud)