Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询,用于计算某物的总持续时间;关于;_Mysql_Datetime_Math_Datediff_Temporal - Fatal编程技术网

MySQL查询,用于计算某物的总持续时间;关于;

MySQL查询,用于计算某物的总持续时间;关于;,mysql,datetime,math,datediff,temporal,Mysql,Datetime,Math,Datediff,Temporal,我在表中有一系列带时间戳的开/关数据,表示开/关状态,或状态“开始”的点 我需要计算(比如)24小时内接通状态的总持续时间 在这个简化示例中,总持续时间=1是 (04:00:00->08:00:00, 09:00:00->15:00:00, 20:00:00->23:59:59 i、 e.13:59:59约14小时 我无法确定这是否可以单独在SQL中完成,或者我正在使用的底层框架(django)是否需要基于返回的数据来完成。如果可能的话,我显然更愿意让数据库完成繁重的工作,因为我们可能还需要在单

我在表中有一系列带时间戳的开/关数据,表示开/关状态,或状态“开始”的点

我需要计算(比如)24小时内接通状态的总持续时间

在这个简化示例中,总持续时间=1是 (04:00:00->08:00:00, 09:00:00->15:00:00, 20:00:00->23:59:59 i、 e.13:59:59约14小时

我无法确定这是否可以单独在SQL中完成,或者我正在使用的底层框架(django)是否需要基于返回的数据来完成。如果可能的话,我显然更愿意让数据库完成繁重的工作,因为我们可能还需要在单独的统计数据包中使用SQL

我不清楚我是否可以对select中的(比如)上一个或下一个元素进行操作,我是一个自信的SQL用户,但不知道从何处开始,也不知道通用方法,有什么想法吗


我真的很想用一个查询或者其他聪明的方法来计算我丢失的数据!

MySQL中没有
row\u number()
,但是您可以通过双连接来搜索前一行:

select 
    sum(case when cur.state = 0 then 0
        else subtime(cur.timeCol, prev.timeCol)
        end) as TotalOnTime
from YourTable cur
join YourTable prev
    on prev.timeCol < cur.timeCol
left join YourTable inbetween
    on prev.timeCol < inbetween.timeCol
    and inbetween.timeCol < cur.timeCol
where inbetween.timeCol is null;
创建和填充测试表的代码:

DROP TABLE IF EXISTS YourTable;
CREATE TABLE YourTable (
   timeCol time,
   state bit
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

insert into YourTable values ('00:00:00',    0);
insert into YourTable values ('04:00:00',    1);
insert into YourTable values ('08:00:00',    0);
insert into YourTable values ('09:00:00',    1);
insert into YourTable values ('15:00:00',    0);
insert into YourTable values ('20:00:00',    1);
insert into YourTable values ('23:59:59',    0);

MySQL中没有
row\u number()
,但是您可以执行双连接来搜索前一行:

select 
    sum(case when cur.state = 0 then 0
        else subtime(cur.timeCol, prev.timeCol)
        end) as TotalOnTime
from YourTable cur
join YourTable prev
    on prev.timeCol < cur.timeCol
left join YourTable inbetween
    on prev.timeCol < inbetween.timeCol
    and inbetween.timeCol < cur.timeCol
where inbetween.timeCol is null;
创建和填充测试表的代码:

DROP TABLE IF EXISTS YourTable;
CREATE TABLE YourTable (
   timeCol time,
   state bit
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

insert into YourTable values ('00:00:00',    0);
insert into YourTable values ('04:00:00',    1);
insert into YourTable values ('08:00:00',    0);
insert into YourTable values ('09:00:00',    1);
insert into YourTable values ('15:00:00',    0);
insert into YourTable values ('20:00:00',    1);
insert into YourTable values ('23:59:59',    0);

首先,我会设计这个表,使打开和关闭状态时间在不同列的同一行上,然后这个任务将是微不足道的。如果这对你来说是不可能的,那么你需要进行大量的黑客攻击才能完成:)首先,我会设计这个表,使打开和关闭状态时间在不同列的同一行上,那么这项任务将是微不足道的。如果这对您来说是不可能的,那么您将面临大量的黑客攻击来完成它:)这个查询的复杂性让我想知道,如果使用代码而不是SQL来完成,这是否会更有效率。不过,看起来它会起作用。我想我了解了变量示例的发展方向,我想多亏了您的帮助,我离这个目标更近了。我不熟悉@lasttime变量之前的句点(“.”)前缀,这有什么作用?我发现这个语法有一个错误,我在手册中找不到它的意思。@Aitch:下一个专栏应该是一个
逗号,我想应该是这样的,但我想我是否错过了一些奇怪的mysql速记缩写:)只是调整了新代码,在你的建议下,我得到了一些令人鼓舞的结果,在我的额外标准下工作;当我完成这个查询时,我会发布完整性的结果。这个查询的复杂性让我怀疑,如果用代码而不是SQL来完成,是否会更有效。不过,看起来它会起作用。我想我了解了变量示例的发展方向,我想多亏了您的帮助,我离这个目标更近了。我不熟悉@lasttime变量之前的句点(“.”)前缀,这有什么作用?我发现这个语法有一个错误,我在手册中找不到它的意思。@Aitch:下一个专栏应该是一个
逗号,我想应该是这样的,但我想我是否错过了一些奇怪的mysql速记缩写:)只是调整了新代码,在你的建议下,我得到了一些令人鼓舞的结果,在我的额外标准下工作;我完成后会发布完整的调查结果