繁体   English   中英

查询mysql以计算一天的总工作时间的可能方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM