3

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

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

例如

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”列过滤。

4

2 回答 2

6

您可以按照以下方式做一些事情:

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';

你可以在这个小提琴中看到它

这通过计算当前记录的日期 ( ) 与小于当前记录日期 ( )T.date的最大日期 ( ) 之间的差异来工作。MAX(TT.date)WHERE TT.date < T.date

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

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

于 2013-08-01T22:26:52.183 回答
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(主表)上的第一行和最后一行就会出现。

于 2013-08-02T16:13:13.357 回答