如何通过交叉引用另一列中的值来查找一列中两个值之间的差异

时间:2012-03-06 21:48:40

标签: mysql sql date

我有一个看起来像这样的表:

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

说实话,我并不关心新的持续时间列如何显示日期之间的距离。我试图自己做这个查询但是失败了。

2 个答案:

答案 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时间戳。