Php 获取一天工作的总小时数、总入小时数、总出小时数

Php 获取一天工作的总小时数、总入小时数、总出小时数,php,mysql,sql,mysqli,Php,Mysql,Sql,Mysqli,我有一个MySQL表,其中记录了员工的进出时间 id device_id punch stat_log 1 26 2016-11-23 11:30:05 in 2 26 2016-11-23 14:30:05 out 3 26 2016-11-23 15:00:05 in 4 26 2016-11-

我有一个MySQL表,其中记录了员工的进出时间

id     device_id           punch          stat_log
 1       26           2016-11-23 11:30:05    in
 2       26           2016-11-23 14:30:05    out
 3       26           2016-11-23 15:00:05    in
 4       26           2016-11-23 20:32:05    out
是否可以使用单个查询从用户的总工作小时数中检索总工作小时数和总工作小时数

我使用了下面的查询:

SELECT 
        device_id as d_id, 
        date(run_start) as start_date, 
        sum(elapsed_min)/60.0 as hrs_on, 
        24 - sum(elapsed_min)/60.0 as hrs_off
   FROM
       (SELECT *, TIMESTAMPDIFF(minute, run_start, run_end) elapsed_min
       FROM 
            (SELECT t1.device_id, t1.punch as run_start, 
                  (SELECT MIN(punch) 
                   FROM emp_punch_in_out t2 
                   LEFT JOIN emp_map e ON e.device_id = t2.device_id
                   WHERE t2.device_id = t1.device_id
                   AND t2.punch > t1.punch
                   AND t2.stat_log = 'out') as run_end
            FROM emp_punch_in_out t1
            WHERE t1.device_id = 26 AND t1.stat_log = 'in') t
      ) tt 
      GROUP BY device_id, start_date
      ORDER BY device_id, start_date
#ID device_id       Date          In_hours     Out_hours
 1     26         2016-11-23       8.5333      15.4667
从这个查询中,我得到了如下结果:

SELECT 
        device_id as d_id, 
        date(run_start) as start_date, 
        sum(elapsed_min)/60.0 as hrs_on, 
        24 - sum(elapsed_min)/60.0 as hrs_off
   FROM
       (SELECT *, TIMESTAMPDIFF(minute, run_start, run_end) elapsed_min
       FROM 
            (SELECT t1.device_id, t1.punch as run_start, 
                  (SELECT MIN(punch) 
                   FROM emp_punch_in_out t2 
                   LEFT JOIN emp_map e ON e.device_id = t2.device_id
                   WHERE t2.device_id = t1.device_id
                   AND t2.punch > t1.punch
                   AND t2.stat_log = 'out') as run_end
            FROM emp_punch_in_out t1
            WHERE t1.device_id = 26 AND t1.stat_log = 'in') t
      ) tt 
      GROUP BY device_id, start_date
      ORDER BY device_id, start_date
#ID device_id       Date          In_hours     Out_hours
 1     26         2016-11-23       8.5333      15.4667
但我想要的结果是一天工作时间的总入时和总出时,包括休息时间

所需输出

#ID device_id       Date          In_hours     Out_hours
 1     26         2016-11-23       8.5333      0.30

假设您的输入表被称为
Table1

Select device_id,
    Date(punch) As "Date",
    Sum(Case When stat_log = 'out' Then TimeStampDiff(minute, punch, next_punch) Else 0 End)/60 As out_hours,
    Sum(Case When stat_log = 'in' Then TimeStampDiff(minute, punch, next_punch) Else 0 End)/60 As in_hours
  From (
Select id, device_id, punch, stat_log, 
    (Select punch 
       From Table1 As n
       Where n.device_id = c.device_id
         And n.punch > c.punch
         And Date(n.punch) = Date(c.punch)
       Order By punch asc
       Limit 1) As next_punch
  From Table1 As c) As x
  Group By device_id, Date(punch);
编辑

#ID device_id       Date          In_hours     Out_hours
 1     26         2016-11-23       8.5333      0.30

在连接谓词中添加了
和Date(n.punch)=Date(c.punch)
,使其可以工作多天

请包括你想要的结果,好的。感谢@Ankitagarawal.的回复。。我希望得到理想的结果,比如进站时间是9小时,出站时间是9小时,出站时间是0.30小时。我进站时间很完美,但出站时间出错了。它给出了24小时后的总离店时间。入住和退房的总次数仅为4次??可以超过4次。emp可以有更多的休息时间,比如茶/咖啡休息时间,所以它会包含在工作时间内。注意,我没有添加
id
字段,因为它看起来有点无意义。“26”,“2016-11-23”,“0.5000”,“8.5333”完美:-)谢谢@mendosiyeah@kapil.dev,这是我想要的结果。@milansoi注意编辑!我的测试输入数据只涵盖了一天,所以我不想在日期加入,否则一天结束时的“输出”将与第二天的第一个“输入”匹配。