次の形式の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 イベントはありません。
行数が奇数の場合、テーブルの最後の行を削除したい。
どうすれば達成できますか。