作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个简单的架构
CREATE TABLE Stack (
`id` INTEGER,
`datetime` DATETIME,
`status` VARCHAR(3)
);
INSERT INTO Stack
(`id`, `datetime`, `status`)
VALUES
('1', '2020-01-01 10:00:00', 'ON'),
('2', '2020-01-01 11:00:00', 'ON'),
('3', '2020-01-01 12:00:00', 'OFF'),
('4', '2020-01-01 12:30:00', 'OFF'),
('5', '2020-01-01 15:00:00', 'ON'),
('6', '2020-01-01 16:00:00', 'ON'),
('7', '2020-01-01 17:30:00', 'OFF'),
('8', '2020-01-01 18:00:00', 'ON');
实际上是一种设备。该设备向我发送日期时间和机器状态。我需要以 00:00:00 等格式获取/计算机器的开关时间,检查数据库的每一行。
最佳答案
除了从“ON”到“NOW()”的最后一位之外,我得到了一个基本的持续时间。它看起来像这样:
SELECT SEC_TO_TIME(SUM(TIMESTAMPDIFF(SECOND, S1.datetime, S2.datetime))) AS duration
FROM Stack AS S1,
Stack AS S2
WHERE S1.id + 1 = S2.id AND
S1.status = 'ON'
这可能也可以写为 JOIN,大多数人更喜欢这样,但这相当于。正如你所看到的,有点与时俱进。结果是:
06:30:00
我在您的数据库中发现了一个错误,有两个 ID 的值为 7。我将第二个更改为 8,现在结果是:
04:30:00
那不可能是对的。哈哈……对不起,让我想想。好的,检查了一下,是正确的。 06:30:00 是由数据库错误引起的。
SELECT SEC_TO_TIME(TIMESTAMPDIFF(SECOND, `datetime`, NOW())) AS `duration`
FROM `Stack`
WHERE `id` = (SELECT MAX(`id`) FROM `Stack`) AND
`status` = 'ON'
它现在返回荒谬的:
838:59:59
这不是正确的结果,所以忽略它。日期对于此查询来说太早了。为了从数据库中获得合理的结果,我更改了
2020-01-01
中的所有日期。至
2021-01-22
.
SELECT
SEC_TO_TIME(
(SELECT SUM(TIMESTAMPDIFF(SECOND, S1.datetime, S2.datetime)) AS duration
FROM Stack AS S1,
Stack AS S2
WHERE S1.id + 1 = S2.id AND
S1.status = 'ON')
+
(SELECT TIMESTAMPDIFF(SECOND, `datetime`, NOW()) AS `duration`
FROM `Stack`
WHERE `id` = (SELECT MAX(`id`) FROM `Stack`) AND
`status` = 'ON')
);
那应该这样做。现在我确信一定有更好的方法来做到这一点,但是,嘿,它有效!
SELECT
SEC_TO_TIME(CAST(
(SELECT SUM(TIMESTAMPDIFF(SECOND, `S1`.`datetime`, `S2`.`datetime`)) AS duration
FROM Stack AS `S1`,
Stack AS `S2`
WHERE `S1`.`id` + 1 = `S2`.`id` AND
`S1`.`status` LIKE 'ON')
+
IFNULL((SELECT TIMESTAMPDIFF(SECOND, `datetime`, NOW()) AS `duration`
FROM `Stack`
WHERE `id` = (SELECT MAX(`id`) FROM `Stack`) AND
`status` LIKE 'ON'), 0)
AS UNSIGNED));
我添加了
CAST(.... AS UNSIGNED)
在第二个之后删除任何东西。
关于MySQL从日期时间计算ON-OFF时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65852409/
我是一名优秀的程序员,十分优秀!