我试图计算每个用户的小时数。一个用户每天可以签入和退房多次。
除了入住和退房外,我还有两个(生意和私人)。
如果用户在最后一次签出到最后一次签入之间有同一天的事件业务,最后一次退房到最后一次签入之间的时间将被视为工作时间。
如果他在退房后有一个业务事件作为最后记录,它将计算时间(签出时间-签入+业务= 8)。
在表中,我为每个用户记录事件的位置。
案例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个工作小时。
案例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在上述情况下,上一次结帐(ID2)到最后一次签入(ID3)之间的时间在工作时间内不算在内。
我正在努力制作脚本来计算每个员工在月中的每一天的工时。
我在如何用最近的CHECK_OUT减去CHECK_IN时间方面有困难,当用户有一天的多条记录时,就会出现这个问题。
发布于 2016-12-06 20:28:38
我现正研究以下假设:
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;
}https://stackoverflow.com/questions/40998182
复制相似问题