计算两行之间的日期时间,显示超过60秒的日期

时间:2014-08-24 11:36:56

标签: mysql sql

我有一张表

id, datetime

1 2014-01-01 01:23:23
2 2014-01-01 01:25:23
3 2014-01-01 01:26:23
4 2014-01-01 01:26:25
7 2014-01-01 01:27:25
8 2014-01-01 01:27:26

我希望收到一份ID列表,他们之间的差异超过60秒。

我的表非常大,当我尝试运行查询时需要很长时间。有没有更简单的方法?表中的ID不是自动增量,它们可以在它们之间跳转。

SELECT A.id, A.datetime, (B.datetime - A.datetime) AS timedifference
FROM MyTable A CROSS JOIN MyTable B
WHERE B.id IN (SELECT MIN(C.id) FROM MyTable C WHERE C.id > A.id 
AND C.datetime between '2014-08-10 00:00:00' AND '2014-08-10 00:01:00') 
AND A.datetime between '2014-08-10 00:00:00' AND '2014-08-10 00:01:00'  
AND B.datetime between '2014-08-10 00:00:00' AND '2014-08-10 00:01:00'  
having timedifference > 60 
ORDER BY A.id ASC;

2 个答案:

答案 0 :(得分:2)

如果我理解正确,你只想找到一分钟或更长的差距。我会建议一个相关的子查询:

select a.id, a.datetime,
       (select id
        from mytable b
        where b.datetime > a.datetime + interval 1 minute
        order by b.datetime
        limit 1
       ) as nextid
from mytable a
where A.datetime between '2014-08-10 00:00:00' AND '2014-08-10 00:01:00'
having nextid is not null;

为了提高性能,您需要mytable(datetime, id)上的索引。

答案 1 :(得分:0)

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,datetime DATETIME NOT NULL
);

INSERT INTO my_table VALUES
(1,'2014-01-01 01:23:23'),
(2,'2014-01-01 01:25:23'),
(3,'2014-01-01 01:26:23'),
(4,'2014-01-01 01:26:25'),
(7,'2014-01-01 01:27:25'),
(8,'2014-01-01 01:27:26');

SELECT a.id
     , TIMEDIFF(b.datetime,a.datetime)
  FROM (SELECT x.*, @i:=@i+1 rank FROM my_table x, (SELECT @i:=0) i ORDER  BY x.id) a
  JOIN (SELECT x.*, @j:=@j+1 rank FROM my_table x, (SELECT @j:=0) j ORDER  BY x.id) b
    ON b.rank = a.rank + 1
   AND b.datetime > a.datetime + INTERVAL 60 SECOND;

+----+---------------------------------+
| id | TIMEDIFF(b.datetime,a.datetime) |
+----+---------------------------------+
|  1 | 00:02:00                        |
+----+---------------------------------+