我有一个机器的mysql日志表,格式如下。
---------------------------------------------------------------------------------------------------
| Event_Id | Event_Type | Machine_No | Operator | Time Stamp | Shift | Reason | Count |
---------------------------------------------------------------------------------------------------
| 101 | Up | Machine1 | operator1 | 2012-06-09 01:03:55 | S1 | Start | 1 |
| 102 | Up | Machine2 | operator2 | 2012-06-09 01:03:55 | S1 | Start | 1 |
| 103 | Up | Machine3 | operator3 | 2012-06-09 01:03:55 | S1 | Start | 1 |
| 104 | Down | Machine1 | operator1 | 2012-06-09 02:03:55 | S1 | Break Down | 1 |
| 101 | Up | Machine1 | operator1 | 2012-06-09 02:33:55 | S1 | After BD | 1 |
---------------------------------------------------------------------------------------------------
这个表继续这样。
传递以下查询。
$data = mysql_query("SELECT * FROM rpt_machine_log WHERE machine='machine1' AND shift='Shift1'")
我能够获得以下输出。
101 Up machine1 operator1 2012-06-09 01:03:55 Shift1 Start of The Shift 1
106 Down machine1 operator1 2012-06-09 03:15:55 Shift1 Break 1
109 Up machine1 operator1 2012-06-09 03:30:55 Shift1 After The Break 1
112 Down machine1 operator1 2012-06-09 03:45:55 Shift1 Break Down 1
115 Up machine1 operator1 2012-06-09 05:00:55 Shift1 After Break Down 1
116 Down machine1 operator1 2012-06-09 05:30:55 Shift1 Break Down 2
117 Up machine1 operator1 2012-06-09 05:45:55 Shift1 After Break Down 2
118 Down machine1 operator1 2012-06-09 06:00:55 Shift1 End of Shift 1
现在我想在php代码中找到每个连续Up和Down Time的区别。
我还想将shift2添加到同一个查询中,以显示shift 1和amp;的机器1日志。 2。
因为我是php的新手,所以我无法解决这个问题。
可以帮助我吗。
答案 0 :(得分:2)
要获得shift2,我也会这样做:
SELECT *
FROM rpt_machine_log
WHERE machine='machine1' AND (shift='Shift1' OR shift='Shift2')
ORDER BY shift,`Time Stamp`
对于包含空格或特殊字符的列,您希望在它们周围添加`。说实话,对所有列都这样做更安全。某些列(例如Add)会导致查询失败,因为add是sql中的保留关键字。
如果您可以保证向上总是跟进,那么您可以遍历结果:
while($row=mysql_fetch_assoc($data)){}
在此之后,有很多方法可以存储数据,可以尝试:
if(isset($timestamp)){
$difftime=strtotime($row['Time Stamp'])-strtotime($timestamp);
$hours=floor($difftime/3600);
$difftime-=$hours*3600;
$minutes=floor($difftime/60);
$difftime-=$minutes*60;
$seconds=$difftime;
$diff_array[]=$hours.":".$minutes.":".$seconds;
unset($timestamp);}
else{
$timestamp=$row['Time Stamp'];}
你有一系列所有时间差异。
显然,如果你不能保证在击倒之后总是会出现向上,或者你想要将shift1和shift2的时间差异分开,那么你将不得不在while循环中添加额外的检查。
--- --- EDIT
if(isset($timestamp)){
$difftime=strtotime($row['Time Stamp'])-strtotime($timestamp);
$diff_array[]=$difftime;
unset($timestamp);}
else{
$timestamp=$row['Time Stamp'];}
foreach ($diff_array as &$value){
$Uptime += $value;}
$hours=floor($Uptime/3600);
$Uptime-=$hours*3600;
$minutes=floor($Uptime/60);
$Uptime-=$minutes*60;
$seconds=$convert;
$Uptime=$hours.":".$minutes.":".$seconds;
--- --- EDIT2
while($row=mysql_fetch_assoc($data)){
$array['event_type'][]=$row['event_type'];
$array['timestamp'][]=$row['Time Stamp'];}
现在你有一个包含两个数组的数组:event_types和timestamps。如果你想要的话,你也可以将它作为两个不同的数组。 $event_type[]=$row['event_type'];
并相应更改其余部分。
您现在可以执行for循环来迭代这些结果并执行所需的检查。
$count=count($array['event_type']);
for($x=0;$x<$count;$x++){
if($row['event_type'][$x]=='Down' && $row['event_type'][$x+1]=='Up'){
}}
请记住在for循环之前计算计数,将其置于其中一个条件意味着每次都会计算它,因此会产生性能成本。
此外,如果您想跳过mysql结果的第一个结果,只需在while循环之前调用$row=mysql_fetch_assoc($data)
一次。
答案 1 :(得分:0)
您也可以通过加入表格完全在MySQL中完成此操作。像这样(未经测试的)代码应该可以工作:
SELECT *
FROM rpt_machine_log rpt1, rpt_machine_log rpt2
WHERE rpt1.event_type = "Up"
AND rpt1.machine_no = rpt2.machine_no
AND rpt2.`time stamp` > rpt1.`time stamp`
AND rpt2.event_type = "Down"
有一些极端情况,但这应该让你开始。