如何使用mysql查询计算员工迟到早退时间

如何使用mysql查询计算员工迟到早退时间,mysql,Mysql,当表为Device时,详细信息包括intime、outtime、empcode和status。使用这些列,我想计算延迟和提前。如果minintime>09:30:00表示延迟。如果maxouttime select * from devicedetails; +-----+---------+----------+----------+------------+----------+--------+ | sno | empcode | intime | outtime | punchd

当表为Device时,详细信息包括intime、outtime、empcode和status。使用这些列,我想计算延迟和提前。如果minintime>09:30:00表示延迟。如果maxouttime<18:30:00表示提前。mysql>

select * from devicedetails;

+-----+---------+----------+----------+------------+----------+--------+
| sno | empcode | intime   | outtime  | punchdate  | Lunch    | status |
+-----+---------+----------+----------+------------+----------+--------+
|   1 | 1001    | 09:00:00 | 18:00:00 | 2015-01-23 | 12:30:00 | P      |
|   3 | 1002    | 09:20:00 | 18:20:00 | 2015-01-23 | 12:30:00 | P      |
|   4 | 139634  | 09:00:00 | 19:00:00 | 2015-01-24 | 12:30:00 | P      |
|   5 | 160173  | 09:30:00 | 18:30:00 | 2015-01-10 | 12:30:00 | P      |
|   6 | 160173  | 11:30:00 | 17:30:00 | 2015-01-10 | 12:30:00 | P      |
|   7 | 160173  | 12:30:00 | 19:30:00 | 2015-01-10 | 12:30:00 | P      |
|   8 | 160178  | 10:00:00 | 17:00:00 | 2015-01-11 | 12:30:00 | P      |
|   9 | 160189  | 09:30:02 | 18:29:02 | 2015-01-12 | 12:30:00 | P      |
|  10 | 160198  | 07:30:02 | 17:29:02 | 2015-01-16 | 12:30:00 | P      |
|  11 | 160216  | 12:30:02 | 20:29:02 | 2015-01-17 | 12:30:00 | P      |
|  12 | 160216  | 00:00:00 | 21:29:02 | 2015-01-17 | 12:30:00 | P      |
|  13 | 160489  | 06:00:00 | 16:00:00 | 2015-01-17 | 12:30:00 | P      |
|  14 | 160575  | 09:30:00 | 18:30:00 | 2015-01-18 | 12:30:00 | P      |
|  15 | 160577  | 09:31:00 | 18:31:00 | 2015-01-18 | 12:30:00 | P      |
|  16 | 160598  | 09:29:00 | 18:29:00 | 2015-01-19 | 12:30:00 | P      |
|  17 | 161061  | 08:29:00 | 17:29:00 | 2015-01-20 | 12:30:00 | P      |
|  18 | 1610612 | 07:29:00 | 14:29:00 | 2015-01-21 | 12:30:00 | P      |
|  19 | 175064  | 07:45:00 | 15:35:05 | 2015-01-23 | 12:30:00 | P      |
|  20 | 176261  | 07:45:38 | 15:35:59 | 2015-01-24 | 12:30:00 | P      |
|  21 | 176374  | 06:56:59 | 17:35:45 | 2015-01-25 | 12:30:00 | P      |
|  22 | 176374  | 00:00:00 | 12:35:45 | 2015-01-25 | 12:30:00 | P      |
|  23 | 176374  | 13:00:00 | 00:00:00 | 2015-01-25 | 12:30:00 | P      |
|  24 | 176374  | 00:00:00 | 19:00:00 | 2015-01-25 | 12:30:00 | P      |
+-----+---------+----------+----------+------------+----------+--------+
23 rows in set (0.53 sec)
Iam使用下面的查询计算..但Iam得到的错误为负值,也有错误的值

select timediff(max(lasttimeout),min(first_timein)) tottime ,subtime((timediff(max(lasttimeout),min(first_timein))),'08:00:00') otime,ifnull(time_format(time_to_sec(subtime(min(first_timein),'09:30:00')),'%H:%i:%s'),'00:00:00') late,ifnull(time_format(time_to_sec(subtime('18:30:00',max(lasttimeout))),'%H:%i:%s'),'00:00:00') early from devicedetails where empcode='16715';
请帮助我……

这有帮助吗

SELECT *,GREATEST(TIMEDIFF('09:30:00',intime),'00:00:00') early FROM devicedetails;
编辑:目前还不清楚您想要什么,但无论如何,下面的查询将返回每个员工每天的加班时间

SELECT empcode
     , punchdate
     , MAX(GREATEST(TIMEDIFF('09:30:00',intime),'00:00:00')) early
     , MAX(GREATEST(TIMEDIFF(outtime,'18:30:00'),'00:00:00')) late
     , ADDTIME(
       MAX(GREATEST(TIMEDIFF('09:30:00',intime),'00:00:00')),
       MAX(GREATEST(TIMEDIFF(outtime,'18:30:00'),'00:00:00')) 
       ) overtime
  FROM my_table
 GROUP
    BY empcode
     , punchdate;
@草莓的


从devicedetails中选择ifmin时间>'09:30:00',TimeDiffmin时间,'09:30:00','00:00:00'延迟

请在您的问题中添加一些格式谢谢您的回答。例如,如果一名员工的上班时间是09:45:00,则表示我们应将迟到时间计算为00:15:00…因为09:30:00是标准办公时间。这将在特定的一天计算。无需找到累积。这是每日报告。在早期也一样。是的,正确。这是一般的轮班时间…我的意思是轮班时间是上午09:30:00到18:30:00。总工作时间8小时。如果任何一个工作时间超过8小时,它会随着时间的推移而增加。所以我需要计算迟到和早退。那么“00:00:00”意味着什么呢?有人做了19小时轮班吗?计算迟到和早退不是问题…19小时意味着随着时间的推移增加了11小时。非常感谢..对答案做了一些更改..现在工作正常..查询是select IFMINIMINTIME>'09:30:00',TIMEDIFMINIMINTIME,'09:30:00','00:00'devicedetails的迟到时间;你是说每个用户每天的第一次上班时间吗?minintime是指一天中只占用第一次上班时间…一天中有多次冲床…这就是为什么我们应该使用minintime和maxouttime…因为它是用于一般轮班…它不是用于轮班的马赫数。。