mysql - 查找丢失的 MySQL 数据

标签 mysql sql

因此,我们有一个名为 timePunches 的表:

CREATE TABLE `timePunches` (
    `punchID` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'The unique ID of the punch',
    `employeeID` VARCHAR(50) NOT NULL COMMENT 'Who did the punch',
    `punchDATETIME` DATETIME NOT NULL COMMENT 'The time of the punch',
    `punchDTC_LINK` DATETIME NULL DEFAULT NULL COMMENT 'The previous start time for the OUT punch',
    `punchDATECRC` INT(100) NOT NULL COMMENT 'The punch CRC, to prevent hacking',
    `punchDIRECTION` TINYTEXT NOT NULL COMMENT 'What the punch did',
    `punchTOTAL` INT(11) NULL DEFAULT NULL,
    `fullName` TEXT NULL,
    PRIMARY KEY (`punchID`)
)
COLLATE='latin1_swedish_ci'
ENGINE=MyISAM
ROW_FORMAT=DYNAMIC
AUTO_INCREMENT=15825

此表用于跟踪我们员工的打卡时间。也就是说,我们会跟踪他们何时进入 和何时退出。该表是一个审计合规表,这意味着我们不SELECT/UPDATE 记录,相反,我们只SELECT/INSERT 它们。

所以,这就是用户打卡时发生的情况:

  • PUNCH IN: 应用程序发送 employeeID(字符串)、punchDATETIME(日期时间)、punchDATECRC (int) 和 punchDTC_LINK (DateTime [null]) 通过存储过程到数据库。此存储过程将必要的信息添加到数据库,包括触发内部函数以将用户的全名提取到同一个表中。

  • PUNCH OUT:应用程序发送employeeID(字符串)、punchDATETIME(日期时间)、punchDATECRC (int) 和 punchDTC_LINK (DateTime) 到数据库。存储过程添加了必要的信息,包括在两个 DateTime 元素之间进行数学计算的触发器,并填写合法名称。

从上面我们可以看出,当用户点击 IN 时,查询看起来像这样:

INSERT INTO timePunches (punchID, employeeID, punchDATETIME, punchDTC_LINK, punchDATECRC, punchDIRECTION, punchTOTAL) VALUES (15797, 'prumple', '2012-01-11 17:35:10', NULL, -2011509138, 'IN', NULL);

而且,当用户打out时,它会发送如下内容:

INSERT INTO timePunches (punchID, employeeID, punchDATETIME, punchDTC_LINK, punchDATECRC, punchDIRECTION, punchTOTAL) VALUES (15797, 'prumple', '2012-01-11 19:39:52', '2012-01-11 17:35:10', -2011509138, 'OUT', NULL);

因此,正如我们所见,该用户的 DataTable 中有 2 个元素。一个 IN 和一个 OUT

我需要做的是查明用户是否忘记打OUT。因此,假设用户打卡IN,整天工作,关闭他们的打卡时钟而不打卡,然后第二天再次打卡IN。然后,他完成了他的全类工作,并记得这次打卡 out

现在,对于这种情况,我们有 2 个 IN 打洞,只有 1 个 OUT 打洞。我需要一种方法来检测这一点。

最佳答案

如果我理解正确,“IN”记录对应的“OUT”记录将在 employeeID(同一员工打卡)和“IN”DATETIME 将匹配“OUT”DTC_LINK

-- Fetch all 'IN' records without a corresponding 'OUT'
    SELECT tp_in.*
     FROM timePunches tp_in
LEFT JOIN timePunches tp_out
          ON tp_in.employeeID = tp_out.employeeID
             AND
             tp_in.punchDATETIME = tp_out.punchDTC_LINK
    WHERE tp_in.punchDIRECTION = 'IN'
          AND
          tp_out.punchDTC_LINK IS NULL;

关于mysql - 查找丢失的 MySQL 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8828941/

相关文章:

SQL - 返回已删除的行

sql - R RODBC 将数字列表放入 IN() 语句

sql - 如果条件匹配,则计算行中的列

MySql - 从表中删除重复项

mysql - SQL 将旧表迁移到带有附加列的新表

mysql - MySQL 中 MIN 列值和 CHAR 列上的 SELECT 非常慢

sql - 如何将列表存储在数据库列中

sql - mysql:如何制作整个数据库的副本?

php - 在 mysql 触发器中检索 php var 的值

php - 查询中 WHERE 约束的顺序