2016-12-06 181 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