1

次の形式のmysqlテーブルがあります

     -------------------------------------------------------------------------------------------------------------
    | event_id | event_type | machine    | user      |  timeStamp          | Shift   | Reason             | Count |
     -------------------------------------------------------------------------------------------------------------
    | 101      | Up         | Machine1   | operator1 | 2012-09-06 01:03:55 | Shift1  | Start of The shift | 1     |
    | 102      | Up         | Machine2   | operator2 | 2012-09-06 01:03:55 | Shift1  | Start of The shift | 1     |
    | 103      | Up         | Machine3   | operator3 | 2012-09-06 01:03:55 | Shift1  | Start of The shift | 1     |
    | 104      | Down       | Machine1   | operator1 | 2012-09-06 02:03:55 | Shift1  | Break Down         | 1     |
    | 101      | Up         | Machine1   | operator1 | 2012-09-06 02:33:55 | Shift1  | After BD           | 1     |
     -------------------------------------------------------------------------------------------------------------

次のクエリを渡すことによって。

  $data = mysql_query("select * from rpt_machine_log where (timestamp between date_sub(now(),INTERVAL 2 WEEK) and now() && (machine='machine$i') && (shift='Shift1') ) AND (reason='Start of The Shift' OR reason='End of Shift') ORDER BY 'even_id'") 

次の出力が得られます

     -------------------------------------------------------------------------------------------------------------
    | event_id | event_type | machine    | user      |  timeStamp          | Shift   | Reason             | Count |
     -------------------------------------------------------------------------------------------------------------
    | 101      | Up         | Machine1   | operator1 | 2012-09-06 01:03:55 | Shift1  | Start of The shift | 1     |
    | 118      | Down       | Machine1   | operator1 | 2012-09-06 06:00:55 | Shift1  | End of The shift   | 1     |
    | 127      | Up         | Machine1   | operator1 | 2012-09-07 01:03:55 | Shift1  | Start of The shift | 1     |
    | 148      | Down       | Machine1   | operator1 | 2012-09-07 02:03:55 | Shift1  | End of The shift   | 1     |
     -------------------------------------------------------------------------------------------------------------

次のコードのように、シフトの終わりとシフトのスターの差を見つけることで、合計シフト時間を計算します。

     while ($row = mysql_fetch_assoc($shifttime{$i})) 
            {
                if(isset($timestamp))
                {
                    $diff_shift_time{$i}= strtotime($row['timestamp']) - strtotime($timestamp);
                    $diff_shift_time_array{$i}[]=$diff_shift_time{$i};
                    unset($timestamp);
                }
                else
                {
                    $timestamp=$row['timestamp'];
                }
            }

            foreach ($diff_shift_time_array{$i} as &$value){
                $Total_shift_time{$i} += $value;
                }

場合によっては、クエリの出力は次のようになります。

     -------------------------------------------------------------------------------------------------------------
    | event_id | event_type | machine    | user      |  timeStamp          | Shift   | Reason             | Count |
     -------------------------------------------------------------------------------------------------------------
    | 121      | Up         | Machine1   | operator1 | 2012-09-06 06:03:55 | Shift2  | Start of The shift | 1     |
    | 124      | Down       | Machine1   | operator1 | 2012-09-06 01:00:55 | Shift2  | End of The shift   | 1     |
    | 151      | Up         | Machine1   | operator1 | 2012-09-07 06:03:55 | Shift2  | Start of The shift | 1     |
     -------------------------------------------------------------------------------------------------------------

合計シフト時間を計算すると、結果のテーブルが Up イベントで終了するため、負の値が得られます。

連続する up と down( so the no of rows of the resultant row should always be even) の計算であるため、最後の up には計算を実行する down イベントはありません。

行数が奇数の場合、テーブルの最後の行を削除したい。

どうすれば達成できますか。

4

2 に答える 2

2

配列のサイズをチェックして、サイズが奇数かどうかを確認します。

    if (sizeof($arr) % 2 == 1) { 
         // This array is odd sized.
         array_pop($arr); // Remove last element. 
    }
于 2012-09-13T17:22:19.947 に答える
2

試す

 $count = mysql_num_rows($shifttime{$i});
 $remove_last = $count%2==0?false:true;
 $cur_key = 0;
 while ($row = mysql_fetch_assoc($shifttime{$i})) 
            {
                if(TRUE === $remove_last && $cur_key == ($count-1))
                      break;
                $cur_key++;

                if(isset($timestamp))
                {
                    $diff_shift_time{$i}= strtotime($row['timestamp']) - strtotime($timestamp);
                    $diff_shift_time_array{$i}[]=$diff_shift_time{$i};
                    unset($timestamp);
                }
                else
                {
                    $timestamp=$row['timestamp'];
                }
            }
于 2012-09-13T17:29:44.393 に答える