2012-11-20 14 views
1

我在PHP中编程相对较新,所以如果这是一个相当简单的问题,我很抱歉。确定同一个MySQL表中两个值的时间戳的差异

我有一个包含下列值称为MachineReports一个MySQL数据库表:ReportNum(主键,自动增加),机号和时间戳

下面是一些示例数据:

|ReportNum | MachineID |  Timestamp  | 
|1   | AD3203  | 2012-11-18 06:32:28| 
|2   | AD3203  | 2012-11-19 04:00:15| 
|3   | BC4300  | 2012-11-19 04:00:15| 

我是什么试图做的是通过迭代每个行集,找出每个机器ID的时间戳差异,以秒为单位。但是,我陷入了这样做的最佳方式。这里是我到目前为止已经编写的代码:

<?php 
include '../dbconnect/dbconnect.php'; 
     $machineID=[]; 

//Get a list of all MachineIDs in the database  
foreach($dbh->query('SELECT DISTINCT(MachineID) FROM MachineReports') as $row) { 
     array_push($machineID, $row[0]); 
    } 

    for($i=0;$i<count($machineID);$i++){ 
    foreach($dbh->query("SELECT MachineID FROM MachineReports WHERE MachineID='$machineID[$i]' ORDER BY MachineID") as $row) { 

    //code to associate each machineID with two time stamps goes here 
} 
    } 

> 此代码只是行列出了表行的内容。 我的最终目标是找出某个MachineID的时间戳差异。我考虑过的一件事是在php中使用多维数组 - 使用$ machineID作为键,然后将时间戳存储在数组中的关键点。

但是,我不知道如何做,因为我的查询逐行解析。

我有很多问题。

1)这是做这件事最有效的方法吗?我怀疑我的数据库表设计可能不是最好的。 2)确定某个机器ID的时间戳差异的最佳方法是什么?

即使只是一个指向一个话题,会促使我以不同的方式思考这个问题将是有益的 - 我不害怕做研究。谢谢!

+1

什么数据库库,你在这里使用?在你的查询字符串中看到裸体变量*不是令人鼓舞的。 – tadman

+0

你每台机器有多少行?它会一直是2行吗? –

+0

根据您的数据样本,您要查找什么输出 – Drew

回答

0

这个解决方案假定你想要每台机器1行,这可能是一个很大的假设!你可以使用now()函数来抵抗ts的最大值。如果您列出您期望的样本输出,我们可以调整答案。

您可以创建一个临时表并使用machineid和maxts以及之前的ts。最后两列为空。为每个不同的机器ID插入一行。然后将每一行maxts更新为ts的最大值。 priorts的每行更新是maxts之前的行max ts。然后u有你的数据

CREATE TABLE t1 (
reportnum int not null AUTO_INCREMENT PRIMARY KEY, 
machineid char(10) not null, 
ts TIMESTAMP 
); 
insert into t1 (machineid,ts) select 'AD3203','2012-11-18 06:32:28'; 
insert into t1 (machineid,ts) select 'AD3203','2012-11-19 04:00:15'; 
insert into t1 (machineid,ts) select 'BC4300','2012-11-19 04:00:15'; 

CREATE TABLE temp_rpt (
machineid char(10) not null, 
maxts TIMESTAMP null, 
priorts TIMESTAMP null 
); 

    insert into temp_rpt (machineid,maxts,priorts) 
select distinct machineid,null,null from t1; 



UPDATE temp_rpt 
SET maxts = 
    (SELECT MAX(ts) 
    FROM t1 
    WHERE machineid = temp_rpt.machineid 
) 

UPDATE temp_rpt 
SET priorts = 
    (SELECT MAX(ts) 
    FROM t1 
    WHERE machineid = temp_rpt.machineid 
    and ts<temp_rpt.maxts 
) 

select * from temp_rpt; 
+-----------+---------------------+---------------------+ 
| machineid | maxts    | priorts    | 
+-----------+---------------------+---------------------+ 
| AD3203 | 2012-11-19 04:00:15 | 2012-11-18 06:32:28 | 
| BC4300 | 2012-11-19 04:00:15 | NULL    | 
+-----------+---------------------+---------------------+ 

然后做你的约会数学

+0

@ JayRizzo03我认为最好有SQL处理它,然后删除表 – Drew

+0

我非常喜欢这个想法。今天晚上我下班的时候我会试试这个。 – JayRizzo03

+0

然后这应该工作http://sqlfiddle.com/#!2/952d7/1 – Drew

0

不知道我完全理解你想要做什么,但如果你想计算的各行之间的时间差MachineID是相同的表我相信像下面这样应该做你需要的东西。

注意:这会查找每行之间的时间差(相同的MachineID,它重置为00:00:00,每个新的MachineID)。如果你想要第一行和最后一行之间的总和,你必须总结TimestampDiff值。

DROP TABLE IF EXISTS tMachineReportsTest; 
CREATE TABLE tMachineReportsTest (
    ReportNum INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    MachineID VARCHAR(6) NOT NULL, 
    Timestamp DATETIME NOT NULL, 
    PRIMARY KEY (ReportNum), 
    UNIQUE KEY (MachineId, Timestamp) 
); 

INSERT INTO tMachineReportsTest VALUES 
(NULL,'AD3203','2012-11-18 06:32:28'), 
(NULL,'AD3203','2012-11-18 10:45:13'), 
(NULL,'BC4300','2012-11-19 04:00:15'), 
(NULL,'AD3203','2012-11-19 11:19:23'), 
(NULL,'BC4300','2012-11-20 06:08:01'), 
(NULL,'AD3203','2012-11-20 18:04:45') 
; 

SET @machineId  := NULL; 
SET @lastMachineId := NULL; 
SET @lastTimestamp := NULL; 

SELECT x.ReportNum, x.MachineId, x.Timestamp, x.TimestampDiff FROM (
    SELECT 
     tMRT.ReportNum, 
     tMRT.MachineId, 
     tMRT.Timestamp, 
     @lastMachineId := @machineId AS _lastMachineId, 
     @machineId  := tMRT.machineId AS _machineId, 
     CASE WHEN @lastMachineId IS NULL OR @lastMachineId = @machineId THEN TIMEDIFF(tMRT.Timestamp, IFNULL(@lastTimestamp, tMRT.Timestamp)) ELSE '00:00:00' END TimestampDiff, 
     @lastTimestamp := tMRT.Timestamp lastTimestamp 
    FROM 
     tMachineReportsTest tMRT 
    ORDER BY 
     tMRT.MachineId, tMRT.Timestamp 
) x 
; 

从得到的查询输出如下所示:

+-----------+-----------+---------------------+---------------+ 
| ReportNum | MachineId | Timestamp   | TimestampDiff | 
+-----------+-----------+---------------------+---------------+ 
|   1 | AD3203 | 2012-11-18 06:32:28 | 00:00:00  | 
|   2 | AD3203 | 2012-11-18 10:45:13 | 04:12:45  | 
|   4 | AD3203 | 2012-11-19 11:19:23 | 24:34:10  | 
|   6 | AD3203 | 2012-11-20 18:04:45 | 30:45:22  | 
|   3 | BC4300 | 2012-11-19 04:00:15 | 00:00:00  | 
|   5 | BC4300 | 2012-11-20 06:08:01 | 26:07:46  | 
+-----------+-----------+---------------------+---------------+ 
6 rows in set (0.01 sec) 
+0

谢谢 - 我也看到了这种方法的价值。 – JayRizzo03

相关问题