2017-06-14 54 views
0

我试图想出添加员工时钟总时间的最佳方法。可能的方法来查询mysql以计算一天中的总工作时间

的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 

所以在这个例子中,我可以尝试计算工作时间的总时间。再一次,我不知道这是否可能。

我真的很感谢任何意见/建议,关于如何做到这一点,或任何其他方式可能更实际这样做!

查询是这样的:

$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"; 

但结果不产生..

+0

您可能想要检查反引用的不完整用法 – RiggsFolly

+0

在这种情况下,您必须使用INOUT ='S''来引发查询返回记录,并且获取具有E且大于S记录的get子查询然后计算差异,然后你会得到工作时间 –

+0

我建议你应该做一些改变你的表结构,以获得更好,更快的结果 –

回答

0

东西可以工作是选择两个员工之间的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找到一个走在时间的差异。

参考文献:Calculate the time difference between of two rows https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timestampdiff

0

另外一个简单的方法在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”;

0

请两次检查查询和与您的代码尝试...我已经做了,你有

$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(); 

你会得到用户的第一年和最后特别OUT一天一个记录,使同样的情景您可以轻松计算出他/她的工作时间。