如何计算具有下一种格式的表格的每个零件的工作小时数?
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
更重要的是,如果在替换日期之后没有失败日期,我们将计算从替换日期到现在或当前日期
的运营时间。请帮帮我。
答案 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