查找日期中有两分钟差异的所有行

时间:2015-08-31 14:44:00

标签: mysql datetime date-difference

我有一张表ACQUISITION,有1 720 208行。

------------------------------------------------------
| id           | date                    | value     |
|--------------|-------------------------|-----------|
| 1820188      | 2011-01-22 17:48:56     | 1.287     |
| 1820187      | 2011-01-21 21:55:11     | 2.312     |
| 1820186      | 2011-01-21 21:54:00     | 2.313     |
| 1820185      | 2011-01-20 17:46:10     | 1.755     |
| 1820184      | 2011-01-20 17:45:05     | 1.785     |
| 1820183      | 2011-01-19 18:21:02     | 2.001     |
------------------------------------------------------

遇到问题后,我需要找到差异小于两分钟的每一行。

理想情况下,我应该可以在这里找到:

| 1820187      | 2011-01-21 21:55:11     | 2.312     |
| 1820186      | 2011-01-21 21:54:00     | 2.313     |
| 1820185      | 2011-01-20 17:46:10     | 1.755     |
| 1820184      | 2011-01-20 17:45:05     | 1.785     |

如果你有任何想法,我在这里很迷失。

2 个答案:

答案 0 :(得分:1)

让我们以微妙的方式重述您的问题,以便我们可以在宇宙热死之前完成此查询。

"我需要知道表中的连续记录,时间戳比两分钟更接近。"

我们可以将"连续"的概念联系起来。你的id值。

尝试此查询,看看您是否获得了不错的效果(http://sqlfiddle.com/#!9/28738/2/0

SELECT a.date first_date, a.id first_id, a.value first_value,
       b.id second_id, b.value second_value,
       TIMESTAMPDIFF(SECOND, a.date, b.date) delta_t
  FROM thetable AS a
  JOIN thetable AS b  ON b.id = a.id + 1 
                     AND b.date <= a.date + INTERVAL 2 MINUTE

使用ON b.id = a.id + 1将自联接工作负载带到脚跟。并且,避免在两个date列值之一上使用函数允许查询利用该列上可用的任何索引。

(id,date,value)上创建覆盖索引将有助于执行此查询。

如果连续行假设在此数据集中不起作用,您可以尝试此操作,将每行与下一行进行比较。它会慢一些。 (http://sqlfiddle.com/#!9/28738/6/0

SELECT a.date first_date, a.id first_id, a.value first_value,
       b.id second_id, b.value second_value,
       TIMESTAMPDIFF(SECOND, a.date, b.date) delta_t
  FROM thetable AS a
  JOIN thetable AS b  ON b.id <= a.id + 10
                     AND b.id >  a.id 
                     AND b.date <= a.date + INTERVAL 2 MINUTE

如果id值作为排序行的方式完全没价值,那么您需要这样做。而且,它会很慢。 (http://sqlfiddle.com/#!9/28738/5/0

SELECT a.date first_date, a.id first_id, a.value first_value,
       b.id second_id, b.value second_value,
       TIMESTAMPDIFF(SECOND, a.date, b.date) delta_t
  FROM thetable AS a
  JOIN thetable AS b  ON b.date <= a.date + INTERVAL 2 MINUTE
                     AND b.date >  a.date
                     AND b.id <> a.id

答案 1 :(得分:0)

使用表格SELF JOIN并使用{/ 1}}函数

TIMEDIFF()