多个记录的时间戳处理
问题描述:
我正在尝试计算每个用户的小时数。一位用户每天可以检查和检查多次。多个记录的时间戳处理
除了事件检查和签出,我还有两个(业务和私人)。
如果用户在同一天的最后一次CHECK OUT和最后一次CHECK IN之间有事件BUSINESS,则最后一次CHECK OUT和CHECK IN之间的时间将被视为工作时间。
如果CHECK OUT后他有一个BUSINESS事件作为最后一条记录,它将计算小时数(退房时间 - CHECK IN + BUSINESS = 8)。
在表中我有一个地方可以为每个用户记录事件。
CASE 1
ID USERID TIME COMMAND
1 1 2016-11-29 08:00:00 CHECK_IN
2 1 2016-11-29 10:05:14 CHECK_OUT
3 1 2016-11-29 12:22:14 BUSINESS
4 1 2016-11-29 13:32:14 CHECK_IN
5 1 2016-11-29 16:00:00 CHECK_OUT
根据上面的表格,我应该得到的是用户对特定天累计工作8小时。
CASE 2
ID USERID TIME COMMAND
1 1 2016-11-29 08:00:00 CHECK_IN
2 1 2016-11-29 10:05:14 CHECK_OUT
3 1 2016-11-29 12:22:14 PRIVATE
4 1 2016-11-29 13:32:14 CHECK_IN
5 1 2016-11-29 16:00:00 CHECK_OUT
在上述上次检出(ID 2)和最近检查之间的时间的情况下在(ID 3)不工作时间计数。
我想使脚本来计算每个员工在每月的每一天的工作时间。
我在如何用最近的CHECK_IN减去CHECK_OUT时间时遇到问题,当用户有一天有多个记录时会发生该问题。
答
我工作过以下假设:
- 工时从来没有跨日历天
- 当天的第一个记录是始终CHECK_IN除非只记录当天是商务或私人
- CHECK_IN记录总是在CHECK_OUT记录之后,在CHECK_IN和下一个CHECK_OUT之间没有其他记录。在CHECK_OUT和下一个CHECK_IN之间只能有一个BUSINESS记录或一个PRIVATE记录(或两者都不)。两者不可兼得。
- 我忽略任何潜在的夏令影响
- 我假设$项与行一个用户的数组一天
function getTimeWorkedFromEntries($entries)
{
$timeWorked = 0;
$lastTimeIn = null;
$lastTimeOut = null;
$lastEntry = null;
// the case where the only entry that day is 'BUSINESS'
if(count($entries) == 1 && $entries[0]['COMMAND'] == 'BUSINESS')
{
$timeWorked = 28800; // 8 hours
}
else
{
foreach($entries as $timeEntry)
{
// first check_in of the day
if($timeEntry['COMMAND'] == 'CHECK_IN' && is_null($lastTimeOut))
{
$lastTimeIn = $timeEntry['TIME'];
}
// CHECK_IN following a CHECK_OUT and then a BUSINESS
else if($timeEntry['COMMAND'] == 'CHECK_IN' && !is_null($lastTimeOut) && $lastEntry['COMMAND'] == 'BUSINESS')
{
$timeWorked += (strtotime($timeEntry['TIME']) - strtotime($lastTimeOut));
$lastTimeIn = $timeEntry['TIME'];
}
else if($timeEntry['COMMAND'] == 'CHECK_IN')
{
$lastTimeIn = $timeEntry['TIME'];
}
// CHECK_OUT that follows a CHECK_IN
else if($timeEntry['COMMAND'] == 'CHECK_OUT')
{
$timeWorked += (strtotime($timeEntry['TIME']) - strtotime($lastTimeIn));
$lastTimeOut = $timeEntry['TIME'];
}
$lastEntry = $timeEntry;
}
}
return $timeWorked;
}
+0
非常感谢您的热心帮助。它以这种方式工作,但是当我使用这个来计算每个用户的小时数和每个月的每一天时,这不算好。我制作了一个脚本,用于检查用户是否在特定的一天进行了检查。该剧本效果很好,现在我想要显示他在那一天执行了多少个小时 – user3651819
有往往不是一个“ “CHECK_OUT”条目和以下“CHECK_IN”条目之间的“BUSINESS”或“PRIVATE”条目? –
它可以是BUSINESS或PRIVATE全天,如果是业务,那么当天用户将获得8小时,如果PRIVATE用户将获得当天0小时。但是如果他离开工作,那么首先总是CHECK_OUT条目,如果他回来工作CHECK_IN。但是每天可以有更多的业务分录 – user3651819
似乎有很多逻辑特定于您的案例。你应该先尝试解决这个问题,然后在遇到困难时询问具体的问题。说“我不知道从哪里开始”(这是我从你的问题中得到的感觉)在这里并不适合。 –