员工计时的计时表

时间:2016-09-14 12:55:08

标签: database-design time

我必须为员工安排时间计时。每个员工都会被一张票证识别,当票证到达并离开大楼时会被扫描。不幸的是,我不能确定他们是否因为法律而到达或离开(他们在地下工作)。

我正在考虑将两行分组到一个以获得工作时间。如果在到达或离开时两次扫描票证,则出现我使用此方法的唯一问题。

你会如何解决这个问题?

到目前为止,这是TicketUsages表的结构 enter image description here

1 个答案:

答案 0 :(得分:0)

如果我要执行这样的任务,我会使用清理技术。

我会查看最近的数据(让我们说昨天' s)并删除(或标记useless)所有可疑行。之后我可以使用一个简单的JOIN来阅读"到达" "离开"行为一:

SELECT *
FROM TicketUsages arriving
JOIN TicketUsages leaving
    ON arriving.ticket_id = leaving.ticket_id
    AND arriving.created_at < leaving.created_at
WHERE from_unixtime(arriving.created_at, '%Y-%m-%d') = '2016-09-14'
    /** Optional: AND NOT arriving.useless AND NOT leaving.useless **/

清理程序只需要找到不同数量的票据然后2.这将显示无效票证:

SELECT ticket_id, count(*)
FROM TicketUsages
WHERE from_unixtime(arriving.created_at, '%Y-%m-%d') = '2016-09-14'
GROUP BY ticket_id
HAVING count(*) != 2

然后你只需要决定如何处理这些行。如果有超过2,你可能只保留第一个和最后一个。但是,如果只返回1行,那么由您决定该做什么。