计算替换零件的工作时间

时间:2018-10-13 03:24:55

标签: php mysql

如何计算具有下一种格式的表格的每个零件的工作小时数?

MySQL表

PART | DATE FAIL  | DATE REPLACE
A    | 2018-09-22 | 2018-10-03
B    | 2018-09-04 | 2018-09-17
B    | 2018-07-06 | 2018-08-26
C    | 2018-08-19 | 2018-10-10
C    | 2018-07-23 | 2018-08-15

我希望结果像这样

PART | OPERATIONAL HOURS | EVALUATION RANGE
A    | 240               | 2018-10-03 to TODAY
B    | 624               | 2018-09-17 to TODAY
B    | 216               | 2018-08-26 to 2018-09-04
C    | 72                | 2018-10-10 to TODAY
C    | 96                | 2018-08-15 to 2018-08-19

示例

例如,您可以在以前的数据中看到,例如 PART B 的更换日期是2018-08-26,而下一个零件在2018-09-04失效,则类似下一个应该在结果表上生成:

PART | OPERATIONAL HOURS | EVALUATION RANGE
B    | 216               | 2018-08-26 to 2018-09-04

更重要的是,如果在替换日期之后没有失败日期,我们将计算从替换日期到现在或当前日期

的运营时间。

请帮帮我。

1 个答案:

答案 0 :(得分:0)

您可以尝试以下操作:

SELECT
    t1.PART,
    TIMESTAMPDIFF(
        HOUR,
        t1.DATE_REPLACE,
        IFNULL(
            (SELECT MIN(DATE_FAIL) FROM oper_hours WHERE DATE_FAIL > t1.DATE_REPLACE AND PART = t1.PART),
            DATE(NOW())
        )
    ) AS OPERATIONAL_HOURS,
    CONCAT(
        t1.DATE_REPLACE,
        " to ",
        IFNULL(
            (SELECT MIN(DATE_FAIL) FROM oper_hours WHERE DATE_FAIL > t1.DATE_REPLACE AND PART = t1.PART),
            DATE(NOW())
        )
    ) AS EVALUATION_RANGE
FROM
    oper_hours AS t1

您可以在此处看到此示例的有效示例:http://www.sqlfiddle.com/#!9/b0cc9e/7/0

第二次尝试(更优雅)并且其中包括评估范围,您可以使用以下方法:

SELECT
    t1.PART,
    TIMESTAMPDIFF(HOUR, t1.DATE_REPLACE, IFNULL(MIN(t2.DATE_FAIL), DATE(NOW()))) AS OPERATIONAL_HOURS,
    CONCAT(t1.DATE_REPLACE, " to ", IFNULL(MIN(t2.DATE_FAIL), DATE(NOW()))) AS EVALUATION_RANGE
FROM
    oper_hours AS t1
LEFT JOIN
    oper_hours AS t2 ON t2.PART = t1.PART AND t2.DATE_FAIL > t1.DATE_REPLACE
GROUP BY
    t1.PART, t1.DATE_REPLACE
ORDER BY
    t1.PART, t1.DATE_REPLACE DESC

这是我在填充了您的数据的测试数据库上从先前查询中获得的结果:

PART  OPERATIONAL_HOURS  EVALUATION_RANGE   
A     240                2018-10-03 to 2018-10-13
B     624                2018-09-17 to 2018-10-13
B     216                2018-08-26 to 2018-09-04
C     72                 2018-10-10 to 2018-10-13
C     96                 2018-08-15 to 2018-08-19

以下也是该示例的一个有效示例:http://www.sqlfiddle.com/#!9/b0cc9e/9