MYSQL - 本周每天的时钟计数小时数

时间:2015-08-06 17:16:12

标签: php mysql

下面是我的数据库timeclock的表格,用于记录员工进/出时的每条记录。我想创建一个函数,返回当周周一至周日每天的小时数。

id  user    timeinout           type    function    
1   1   2015-08-05 20:20:32     in         1
2   1   2015-08-05 20:20:56     out        1
3   1   2015-08-05 20:29:25     in         1
4   1   2015-08-05 20:32:04     out        2
5   1   2015-08-05 20:36:28     in         1
6   1   2015-08-05 20:40:00     out        1
7   1   2015-08-06 09:05:39     in         1

我知道这个功能是错误的,但这就是我的位置。我之前从未这样做过,所以我真的很失落,我尝试过的所有例子都失败了。

function gettimeclockHours($user) {
  include $_SESSION['db'];
  try {
      $sql = "SELECT HOUR(timeinout) as hour, COUNT(*) as num_rows FROM timeclock WHERE user = :user GROUP BY HOUR(timeinout)";
      $s = $pdo->prepare($sql);
      $s->bindValue(':user', $user);
      $s->execute();
  }
  catch (PDOException $e)
  {
      $error = 'Error.' . $e->getMessage();
      moduleError($error);
      exit();
  }
  $result = $s->fetch();
  return $result;
}

我正在寻找的输出示例如下。

Day of Week     Total Time
Monday          1.2 Hours
Tuesday     
Wednesday   
Thursday    
Friday  
Saturday    
Sunday  

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

按工作日(周一,周二等)分割日期实际上是简单的问题。您可以使用DAYNAME()功能。

更有趣的任务是计算用户内部的时间。 它可以是sum(outs_time)-sum(ins_time),但万一,当用户在23:45到达并在第二天00:15离开时它不会工作。在这种情况下,我们需要在24:00:00添加额外的

我会选择以下解决方案: 1.从一天开始将时间转换为秒(TIME_TO_SEC() 2.检查最后一个动作是什么"在"并在子查询中创建一个标志

select if(max(if(type = 'in', timeinout, 0)) > max(if(type = 'out', timeinout, 0)), 1,0) // 1 - last type is in, 0 - last type is out
from timeclock t1 
  1. 如果最后一个类型="在"

    中添加24小时的最终查询
    select DAYNAME(timeinout) as weekday_name,
    (
      sum(if(type = "out",TIME_TO_SEC(timeinout), 0)) - 
      sum(if(type = "in",TIME_TO_SEC(timeinout), 0)) + 24*60*60*
      (select if(max(if(type = 'in', timeinout, 0)) > max(if(type = 'out', timeinout, 0)), 1,0) // 1 - last type is in, 0 - last type is out
        from timeclock t1 
        where t1.user = t2.user and date(t1.timeinout) = date(t2.timeinout))
    )/60/60 hours
    FROM timeclock t2
    GROUP BY user, date(timeinout)