Php 获取一天工作的总小时数、总入小时数、总出小时数
我有一个MySQL表,其中记录了员工的进出时间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-
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注意编辑!我的测试输入数据只涵盖了一天,所以我不想在日期加入,否则一天结束时的“输出”将与第二天的第一个“输入”匹配。