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;