下面是我的数据库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
提前感谢您的帮助。
答案 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
如果最后一个类型="在"
中添加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)