Mysql查询高效的日期计算

Mysql查询高效的日期计算,mysql,date,Mysql,Date,我有一张桌子: ID RECORD_DATE 1 2012-12-15 00:00:00 2 2012-12-16 00:00:00 3 2012-12-17 00:00:00 4 2012-12-17 16:00:00 现在我需要计算相邻日期之间的时间,所以它看起来像: start

我有一张桌子:

ID           RECORD_DATE              
1            2012-12-15 00:00:00      
2            2012-12-16 00:00:00      
3            2012-12-17 00:00:00      
4            2012-12-17 16:00:00      
现在我需要计算相邻日期之间的时间,所以它看起来像:

start                  end                  difference
2012-12-15 00:00:00    2012-12-15 23:59:59  23:59:59
2012-12-16 00:00:00    2012-12-16 23:59:59  23:59:59
2012-12-17 00:00:00    2012-12-17 16:00:00  16:00:00
有什么有效的方法可以在数据库端进行这种计算吗


非常感谢您的帮助。

我不明白您说的是什么,但请尝试一下

SELECT t1.RECORD_DATE AS start,
       t2.RECORD_DATE AS end,
       TIMEDIFF(t2.RECORD_DATE,t1.RECORD_DATE) AS difference
FROM TABLE AS t1
JOIN TABLE AS t2 ON t1.id = (t2.id + 1);

使用此类或查询,使用
TIME\u DIFF()


这里有一种处理相邻行的方法,当它不是顺序的,即在id=1之后,您可能有4或5等

select 
t1.RECORD_DATE as `start`,
t2.RECORD_DATE as `end`,
TIMEDIFF(t2.RECORD_DATE, t1.RECORD_DATE) as difference
from table_name t1
join table_name t2 on t2.ID = (
                  select MIN(x.ID) 
                  from table_name x 
                  where x.id > t1.id
)
另外,我注意到您将结束日期从
2012-12-16 00:00:00
改为
2012-12-15 23:59:59
,这与表中的不同,因此您可能需要使用
date_sub()
从结束日期中减去1秒

SELECT x.*
     , MIN(y.record_date - INTERVAL 1 SECOND) end
     , TIMEDIFF(MIN(y.record_date) - INTERVAL 1 SECOND,x.record_date) diff 
  FROM my_table x 
  JOIN my_table y 
    ON y.record_date > x.record_date 
 GROUP 
    BY x.id;

如果有关系的话,我想一些外部连接的技巧可以处理丢失的第二个

是的。这可以在数据库端有效地完成。你能解释一下从前两个结果中减去1秒,而不是第三个结果的逻辑吗?此外,我们希望看到适当的DDL以及作者迄今为止所做的最大努力。TIMEDIFF()是一个很好的开始…假设id是递增的(没有间隙)-并且日期和id不会超出顺序只是更改了
t_end.id>t_start.id
,以防止丢失条目破坏一切。嗯,现在您需要(或MIN…GROUP BY)。我们能用一个更简单的查询吗?我不相信增量ID的假设是合理的(尽管我承认它们在上面提供的示例中)即使我对这个查询也不满意,但我是在假设增量id的情况下编写的,尽管我们可以通过查询中的少量更改对其进行排序,无论如何,感谢您的关注。:@RaghavPotluri我刚刚测试了您的查询,它提供了快速执行。不幸的是,我必须处理没有增量序列的可能性。感谢you@Adnan是的,我写这篇文章时考虑到了你的例子。我会尝试一个更好的答案。谢谢:)
SELECT x.*
     , MIN(y.record_date - INTERVAL 1 SECOND) end
     , TIMEDIFF(MIN(y.record_date) - INTERVAL 1 SECOND,x.record_date) diff 
  FROM my_table x 
  JOIN my_table y 
    ON y.record_date > x.record_date 
 GROUP 
    BY x.id;