如何获取表中连续记录之间的天数?

时间:2013-08-01 22:17:25

标签: mysql sql date datediff

在MySQL中,我有一个包含多个列的表,其中一列是日期列。 我希望能够进行查询,以便我可以获得一个额外的列,显示当前日期(每行的日期)和上一行的日期之间的天数。

记录的顺序是按日期,我​​按其他列过滤。

e.g。

id  other_col   date        days_between_dates
1   abc     2013-05-01      0
2   abc     2013-05-07      6
3   abc     2013-05-09      2
4   abc     2013-05-19      10
5   abc     2013-05-25      6
6   abc     2013-06-03      9
7   abc     2013-06-14      11

显然,由于第一行无法比较,因此应显示0

我知道我可以使用datediff MySQL函数获得两个日期之间的差异,例如

select datediff('2013-06-03','2013-05-25');

我的基本查询是select * from mytable where other_col = 'something' order by date; 但是如何进行查询以直接获得结果,如示例中所示? (我需要额外的“days_between_dates”栏目。

另请注意,通常id是有序的,没有间隙,但我无法保证。只是我将按升序日期排序,并按“other_col”列进行过滤。

2 个答案:

答案 0 :(得分:4)

你可以按照以下方式做点什么:

SELECT T.id, 
       T.other_col, 
       T.yourdate, 
       IFNULL(datediff(T.yourdate,(select MAX(TT.yourdate) 
                                   FROM yourtable TT 
                                   WHERE TT.yourdate < T.yourdate 
                                   AND TT.other_col = 'abc')),0)
FROM yourtable T
where other_col = 'abc';

您可以在此fiddle

中看到它

这可以通过计算当前记录的日期(T.date)与小于当前记录日期({{1}的最大日期(MAX(TT.date))之间的差异来实现。 }})。

当没有较小的日期时,COALESCE会使其为0,而不是null。

编辑。添加合并以在第一行中给出0

答案 1 :(得分:2)

我打算建议替代上面给出的答案。如果你可以保证id是顺序的,你可以将表连接到自己以获得你想要的结果:

SELECT t1.id, t1.other_col, t1.date, DATEDIFF(t2.date,t1.date)
FROM table AS t1
LEFT_JOIN table AS t2 ON t1.id = t2.id - 1

请注意,我在这里使用LEFT JOIN,以便t1(主表)上的第一行和最后一行出现。