[英]Possible way to query mysql for calculate total time worked in a day
我正在尝试提出最好的方法来增加员工的总工作时间。
INOUT类型为S&E。
我在想像这样的东西可能是最好的解决方案,但我不知道这是否可行或什至可行:
例如:
No EnNo INOUT DateTime
1 12 S 2017-06-02 08:35
2 28 S 2017-06-02 10:10
3 28 E 2017-06-02 13:00
4 12 E 2017-06-02 14:02
5 12 S 2017-06-02 15:03
6 12 E 2017-06-02 18:09
因此,在此示例中。我可以尝试计算总工作时间Hours。 再次,我不知道这是否可能。
我非常感谢您对如何完成此操作的任何评论/建议,或任何其他可能更实用的方法!
查询如下:
$query = "SELECT EnNo,
sum(case
when INOUT = 'E' then -DATEDIFF(MINUTE,2017-06-02,DateTime)
when INOUT = 'S' then DATEDIFF(MINUTE,2017-06-02,DateTime)
end
)/60 as Working Hours
From `dataimport`
Group By dataimport.EnNo";
但是结果不是产生。
可行的方法是在两名员工之间选择TIMESTAMPDIFF
。 您确实必须以这种方式将表本身连接起来,以使同一天拥有S和E的两条雇员记录之间存在差异。
我尝试了一下,没有进行测试就提出了以下建议,但这应该为您指明正确的方向:
SELECT
A.EnNo, TIMESTAMPDIFF(MINUTE,A.DateTime,B.DateTime)/60 AS WorkingHours
FROM dataimport A INNER JOIN dataimport B ON A.EnNo = B.EnNo AND
(A.INOUT = 'E' AND B.INOUT = 'S') OR (A.INOUT = 'S' AND B.INOUT = 'E')
AND TIMESTAMPDIFF(DAY,A.DateTime,B.DateTime) = 0
注意:您也可以更改TIMESTAMPDIFF
,以一次性找到小时数差异。
参考: 计算两行之间的时差 https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timestampdiff
另外一种简单的方法来计算PHP!
$ datetime1 = new DateTime('2017-06-02 08:35');
$ datetime2 = new DateTime('2017-06-02 14:02');
$ duration = $ datetime1-> diff($ datetime2);
echo $ duration-> format('%h')。“ Hours”。$ duration-> format('%i')。“ Minutes”;
请检查查询两次,然后尝试使用您的代码...我已经完成了与您相同的方案
$query->select("a.*,a.DATE_FORMAT(a.date_time,'%Y-%m-%d') as `new_date`,
DATE_FORMAT(a.date_time,'%Y-%m-%d 23:59:00') as `last_datetime`,
DATE_FORMAT(a.date_time,'%Y-%m-%d 00:01:00') as `first_datetime`,
@last_value:=(SELECT date_time FROM master a2
WHERE a2.enroll=a.enroll
and (a2.INOUT = 'E' )
and (a2.`date_time` <= last_datetime and a2.`date_time`>first_datetime)
group by a2.date_time
ORDER BY a2.date_time DESC LIMIT 1) as last_value,
");
$query->from('master as a')
->andWhere('a.enroll IS NOT NULL and a.INOUT="S"')
->groupBy('a.enroll,new_date')
->orderBy('a.enroll,a.date_time');
$attendence_db_data = $query->all();
在一条记录中,您将获得特定日期的用户的第一个IN和最后一个OUT,以便您可以轻松地从该值计算出他/她的工作时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.