如何从php中的两个连续行中找出两个字段的差异?
我有一个机器的mysql日志表,格式如下如何从php中的两个连续行中找出两个字段的差异?,php,mysql,Php,Mysql,我有一个机器的mysql日志表,格式如下 --------------------------------------------------------------------------------------------------- | Event_Id | Event_Type | Machine_No | Operator | Time Stamp | Shift | Reason | Count | -------------
---------------------------------------------------------------------------------------------------
| 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代码中每个连续上升和下降时间的差异
我还想将shift2添加到同一查询中,以显示SHIFT1和shift2的machine1日志
因为我是php新手,所以无法解决这个问题
有什么能帮我的吗。要让我也能换班,我会:
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\u fetch\u 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'];}
这里有一系列的时间差
显然,如果您不能保证up总是在down之后出现,或者您想要分割shift1和shift2的时间差,那么您必须在while循环中添加额外的检查
---编辑---
---编辑2---
现在您有了一个由两个数组组成的数组:事件类型和时间戳。如果需要,也可以将其作为两个不同的数组来执行,例如,$event\u type[]=$row['event\u 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'){
}}
$count=count($array['event_type']);
对于($x=0;$x您也可以在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"
有一些极端情况,但这应该让您开始。一些建议。1)您可能希望在查询中添加order by以保证顺序,2)您应该研究循环以迭代$data,3)您不应该使用mysql\u查询,而应该使用mysqli\u查询,因为不鼓励使用前者。谁创建了您的日志表?什么是PK?非常感谢Mryb先生。它工作得很好。但我有一个疑问。如果表格值以down开头,然后是up,它会工作吗?我还想划分shift1和shift2的时差。这就是为什么我说你必须保证这种方法的顺序,但是在查询结束时使用order BY time STAMP
,你总是会得到较早时间先于较晚时间的结果,这从你的日志中似乎表明了一个向上和向下的顺序。如果您确实想先向下排序,然后切换$difftime=strottime($row['Time Stamp'])-strottime($timestamp)代码>到$difftime=strottime($timestamp)-strottime($row['Time Stamp'])代码>应该可以做到这一点。这一切都取决于顺序,如果您想保持灵活性,那么您需要开始添加检查。在没有任何ifs的情况下分离shift1和shift2的最简单方法是,通过将值转换为变量名,并使用${$row['shift']}[]=$hours.:“$minutes.”:“$seconds.;创建基于哪个移位的数组代码>然后有两个数组,$shift1和$shift2一个小疑问。当我尝试使用,foreach($diff_array as&$value){$Uptime+=$value;}添加数组的所有值时。
输出是2
,而不是3:12:0。如何将数组的所有值添加到起床时间?如果要将它们全部添加到一起,最好在将它们全部添加到一起后进行小时:分钟:秒转换,因为它们当前的格式不正确。我将对我的答案进行编辑以反映这一点。
$count=count($array['event_type']);
for($x=0;$x<$count;$x++){
if($row['event_type'][$x]=='Down' && $row['event_type'][$x+1]=='Up'){
}}
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"