2016-12-06 4 views
0

各ユーザーの時間を計算しようとしています。 1人のユーザーが1日に複数回チェックインとチェックアウトを行うことができます。イベントがINをチェックして、チェックアウトのほかに複数のレコードのタイムスタンプ操作

、私は2つ以上(ビジネスやプライベートな)を持っています。

ユーザーが最後にCHECK OUTとの間に最後のチェックと最後のチェックで同じ日に、時間との間のイベント・ビジネスをOUTあり、チェックインの場合は、労働時間とみなされるであろう。

彼はCHECK OUTの後に最後のレコードなどのビジネスイベントを持っている場合、それは(時間をチェック - 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労働時間を持っていることを取得する必要があり、上記の表によります。 (ID 3)の最後のチェックアウト(ID 2)と最終チェックの間の時間以上

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 

は労働時間にカウントされません。

私は月ごとに各従業員の勤務時間を計算するスクリプトを作成しようとしています。

私が最も近いCHECK_INでCHECK_OUT時間を減算する方法についてのトラブルを抱えていたユーザが、一日のために複数のレコードを持っている場合、その問題が発生します。

+0

のために一人のユーザーのための行と列を

  • 私は$そのエントリを想定しています任意の潜在的な夏時間の影響をされて無視していますが、常にあるのどちらか」 「CHECK_OUT」エントリとそれに続く「CHECK_IN」エントリの間に「BUSINESS」または「PRIVATE」エントリがありますか? –

  • +0

    ビジネスやプライベートにすることができます。ビジネスであれば、PRIVATEユーザーがその日に0時間を取得すると、その日に8時間を受け取ります。しかし、もし彼が仕事を辞めれば、常にCHECK_OUTが最初にエントリーされ、彼が仕事に戻るとCHECK_INになります。しかし、1日に多くのビジネス・エントリーを持つことができます – user3651819

    +0

    ここでは、あなたのケースだけに関連する多くの論理があるようです。最初にこれを解決しようとする必要があります。次に、何かにこだわったときに特定の質問をしてください。「どこから始めたらいいのかわかりません」と言っている(あなたの質問から得た感じです)、実際にはあまり適していません。 –

    答えて

    2

    私は次のような仮定のオフに働いています:

    • 時間働い決してクロス暦日
    • 日の最初のレコードは、レコードだけしない限り、その日は、ビジネスやPRIVATE
    • は常にCHECK_INですCHECK_INレコードは常にCHECK_INと次CHECK_OUT
    • の間に他のレコードと一緒にした後CHECK_OUTレコードを持っているだけCHECK_OUTと次CHECK_INの間で業務記録または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

    関連する問題