Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从php中的两个连续行中找出两个字段的差异?_Php_Mysql - Fatal编程技术网

如何从php中的两个连续行中找出两个字段的差异?

如何从php中的两个连续行中找出两个字段的差异?,php,mysql,Php,Mysql,我有一个机器的mysql日志表,格式如下 --------------------------------------------------------------------------------------------------- | Event_Id | Event_Type | Machine_No | Operator | Time Stamp | Shift | Reason | Count | -------------

我有一个机器的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代码中每个连续上升和下降时间的差异

我还想将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"