2016-12-06 98 views
0

我正在尝试计算每个用户的小时数。一位用户每天可以检查和检查多次。多个记录的时间戳处理

除了事件检查和签出,我还有两个(业务和私人)。

如果用户在同一天的最后一次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时间时遇到问题,当用户有一天有多个记录时会发生该问题。

+0

有往往不是一个“ “CHECK_OUT”条目和以下“CHECK_IN”条目之间的“BUSINESS”或“PRIVATE”条目? –

+0

它可以是BUSINESS或PRIVATE全天,如果是业务,那么当天用户将获得8小时,如果PRIVATE用户将获得当天0小时。但是如果他离开工作,那么首先总是CHECK_OUT条目,如果他回来工作CHECK_IN。但是每天可以有更多的业务分录 – user3651819

+0

似乎有很多逻辑特定于您的案例。你应该先尝试解决这个问题,然后在遇到困难时询问具体的问题。说“我不知道从哪里开始”(这是我从你的问题中得到的感觉)在这里并不适合。 –

回答

2

我工作过以下假设:

  • 工时从来没有跨日历天
  • 当天的第一个记录是始终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; 
} 

Live Example

+0

非常感谢您的热心帮助。它以这种方式工作,但是当我使用这个来计算每个用户的小时数和每个月的每一天时,这不算好。我制作了一个脚本,用于检查用户是否在特定的一天进行了检查。该剧本效果很好,现在我想要显示他在那一天执行了多少个小时 – user3651819