这是我的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)
第一部分将生成您正在检查的日期。
第二个抓取该周内登录的所有员工。如果你有一个单独的员工表,你可以在这里替换它,这样你就会得到整周都没有登录的员工。它加入的最后一部分是您拥有的滴答声。
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)
| 归档时间: |
|
| 查看次数: |
2227 次 |
| 最近记录: |