mysql - 查找连续缺席的天数

标签 mysql sql

我有一个 MySql 表 attendance,其中包含 empnotimeindate 列。我无法获取连续 3 天缺勤的员工的数据:

这是我的示例数据:

==========
empno:     | timeindate

empno 1    | 2013-10-01 00:00:00
empno 2    | 2013-10-01 00:00:00
empno 1    | 2013-10-02 00:00:00
empno 2    | 2013-10-02 00:00:00
empno 2    | 2013-10-03 00:00:00
empno 2    | 2013-10-04 00:00:00
empno 2    | 2013-10-05 00:00:00
empno 1    | 2013-10-06 00:00:00
empno 2    | 2013-10-06 00:00:00
----------

请帮忙,我已经阅读了几篇文章,但没有提供我需要的数据,我感到很困惑。如果有任何答案,我将不胜感激。

最佳答案

我会尝试这样的事情。

WITH T AS
(SELECT empno, dateintime, @row:=@row+1 rownum FROM
attendance JOIN (SELECT @row:=0) init
ORDER BY empno, timeindate)

SELECT DISTINCT t1.empno
FROM T AS t1 INNER JOIN T AS t2
ON t1.empno = t2.empno AND t1.rownum = t2.rownum + 1
WHERE TIMESTAMPDIFF(DAY, t2.dateintime, t1.dateintime) >= 3

第一个查询按日期时间对表进行排序并枚举行。然后,您将它与自身连接起来,移动行号,在一行中获取相邻的日期时间。然后,您只需查找具有所需差异的条目。

我不确定它是否有效,但它应该是这样工作的:第一个查询:

empno:     | timeindate          | row

empno 1    | 2013-10-01 00:00:00 | 0
empno 1    | 2013-10-02 00:00:00 | 1
empno 1    | 2013-10-06 00:00:00 | 2
empno 2    | 2013-10-01 00:00:00 | 3
empno 2    | 2013-10-02 00:00:00 | 4
empno 2    | 2013-10-03 00:00:00 | 5
empno 2    | 2013-10-04 00:00:00 | 6
empno 2    | 2013-10-05 00:00:00 | 7
empno 2    | 2013-10-06 00:00:00 | 8

没有 WHERE 子句的第二个查询:

empno 1    | 2013-10-02 00:00:00 | 2013-10-02 00:00:00
empno 1    | 2013-10-02 00:00:00 | 2013-10-06 00:00:00
empno 2    | 2013-10-01 00:00:00 | 2013-10-02 00:00:00
empno 2    | 2013-10-02 00:00:00 | 2013-10-03 00:00:00
etc.

如您所见,WHERE 将从该结果中过滤出第二行。

关于mysql - 查找连续缺席的天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19939785/

相关文章:

mysql - laravel5.4 中 undefined variable

php - AND 和 OR 子句的组合

php - 在sql中按数组中的值获取行

sql - 获取记录中的重复值

javascript - 在 JavaScript 中模拟 SQL LIKE

c# - LinqToSql 引用的实体将抛出 NullReferenceException

sql - 如何计算 varchar 字段中的每个字符?

mysql - 将列值限制为预定义的字符串列表

php - 从 SQL 数据库获取最后一篇文章

mysql - 如何在mysql中获取每周的最后一条记录