在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”列进行过滤。
答案 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(主表)上的第一行和最后一行出现。