合并sql表中重叠的日期间隔



我有一个表,其中包含员工的轮班签到和下班时间。每条记录都有AutoGenID、employeeID、开始日期时间和结束日期时间。基于这些数据,我想找出每个员工在一段时间内(如一个月(的工作时间。

这不是基于网络的,而是一个可以在离线模式下运行的移动和PC应用程序。

问题是,一名员工可能有多条记录,也可能没有多条记录的日期间隔重叠。这是因为一名员工每天可以单独登录多台设备,并且所有这些条目都添加到这个集中的数据库表中。因此,单个员工的日期间隔可能重叠,也可能不重叠。

例如,假设用户A在"2015-07-03 10:51:19"从他的手机登录,然后在"2015-07 03 12:36:14"从他的电脑再次登录

当天结束时,他在"2015-07-03 18:12:29"从PC上注销,并在"2015-07 03 18:19:53"上注销了手机

第二天他只使用电脑登录。所以在数据库上我有以下记录。

+----+-----------+---------------------+---------------------+
| ID |   EmpID   |         start       |         End         |
+----+-----------+---------------------+---------------------+
| 1  |   EM001   | 2015-07-03 10:51:19 | 2015-07-03 18:19:53 |
| 2  |   EM001   | 2015-07-03 12:36:14 | 2015-07-03 18:12:29 |
| 3  |   EM001   | 2015-07-04 11:34:52 | 2015-07-04 17:21:43 |
+----+-----------+---------------------+---------------------+

但在查询数据时,我只需要员工的工作时间。因此,如果日期重叠,我需要第一个开始时间和最后一个结束时间,这样我就可以计算小时数。同样,这个问题只存在于时间重叠的日子里,在某些日子里,单个员工的时间可能不会重叠。

此工时计算不适用于员工工资计算。这只是为了捕捉用户的工作时间。

有人知道如何做到这一点吗。

感谢

Dipen Shah说得有道理,但有时您无法更改登录的记录方式。在这种情况下,也许您可以尝试按日期对表进行分组,并查询每个用户和日期的最小值(开始(和最大值(结束(,如下所示:

select empid, min(start), max(end) from signin group by empid, date(start);

相关内容

  • 没有找到相关文章

最新更新