我有一个看起来像这样的表:
id | machine | date | status
----------------------------
1 | 1 | 01-01-2009 | New
1 | 1 | 01-01-2010 | Busted
1 | 2 | 01-01-2010 | New
1 | 1 | 01-01-2012 | Repaired
我需要知道每台状态PER机器之间的日期差异,如果它是最新状态且该机器没有更新状态,则需要显示上次列出的日期与当前日期之间的差异:
id | machine | date | status | duration
---------------------------------------
1 | 1 | 01-01-2009 | New | 1 year
1 | 1 | 01-01-2010 | Busted | 2 years
1 | 2 | 01-01-2010 | New | 2 years, 2 months, 5 days
1 | 1 | 01-01-2012 | Repaired | 2 months, 5 days
说实话,我并不关心新的持续时间列如何显示日期之间的距离。我试图自己做这个查询但是失败了。
答案 0 :(得分:7)
这将为您提供以天为单位的值 -
SELECT *, DATEDIFF(IFNULL((SELECT `date` FROM machine_status ms2 WHERE ms1.machine = ms2.machine AND ms1.`date` < ms2.`date` ORDER BY `date` ASC LIMIT 1), CURRENT_DATE), ms1.`date`)
FROM machine_status ms1;
答案 1 :(得分:4)
我认为最简单的方法是获取每台机器的最后两条记录,然后比较代码中的日期(简单减法)以找出差异。
我发现this article描述了如何将GROUP BY与两个对象一起使用(仅获取每台机器的最后两个)
要按日期排序,您可能需要更改存储日期的方式。通常使用Unix时间戳。