下面是我的数据库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
感谢您提前提供的帮助。
最佳答案
按工作日(周一、周二等)分割日期实际上是一个简单的问题。您可以使用DAYNAME()功能。
更有趣的任务是计算用户进入的时间。 它可以是 sum(outs_time)-sum(ins_time),但以防万一,当用户在 23:45 到达并在第二天 00:15 离开时,它将不起作用。在这种情况下,我们需要在 24:00:00 添加额外的内容
我会寻求以下解决方案: 1. 将时间转换为从一天开始算起的秒数 ( TIME_TO_SEC() 2.检查最后一个 Action 是“in”并在子查询中做一个标志
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
如果最后输入=“in”,则最终查询会添加 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)
关于php - MYSQL - 时钟计算本周每一天的进出时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31861927/