Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 获取datetime范围内进程的开始和结束_Mysql_Date_Datetime - Fatal编程技术网

Mysql 获取datetime范围内进程的开始和结束

Mysql 获取datetime范围内进程的开始和结束,mysql,date,datetime,Mysql,Date,Datetime,MySQL查询以查找给定日期范围内进程的开始和结束。在给定的日期范围内可以有多个进程。如果只有一个进程,我编写的查询将正确地给出开始和结束。如果有2个进程,则给出第一个进程的开始日期时间戳和第二个进程的结束日期时间戳。如何获取第一个流程和第二个流程的开始时间和结束时间戳 表包含两列 日期时间 位值 注意:当进程开始时,值为1,否则为0。为了确定开始时间,我们必须得到第一行的值为1,前一行的值为0。类似地,对于结束时间,我们必须识别值为1的最后一行和值为0的下一行 查询: -用值1标识第一行

MySQL查询以查找给定日期范围内进程的开始和结束。在给定的日期范围内可以有多个进程。如果只有一个进程,我编写的查询将正确地给出开始和结束。如果有2个进程,则给出第一个进程的开始日期时间戳和第二个进程的结束日期时间戳。如何获取第一个流程和第二个流程的开始时间和结束时间戳

表包含两列

日期时间 位值 注意:当进程开始时,值为1,否则为0。为了确定开始时间,我们必须得到第一行的值为1,前一行的值为0。类似地,对于结束时间,我们必须识别值为1的最后一行和值为0的下一行

查询: -用值1标识第一行

    SET @row_number = 0, @result = 0;
    select @result := (a.num - 1) as prev_rec, a.num, a.date_time, a.value from (
        SELECT (@row_number:=@row_number + 1) AS num, date_time, value
        FROM table1
        where date_time >= '2020-02-19 00:00:00' and date_time <= '2020-02-25 23:59:00') as a
    where a.value = 1 
    order by a.date_time limit 1;
我能找到解决办法吗


如果我遗漏了任何相关内容,请原谅。我第一次在这里问一个问题。

要在mysql 8或mariadb 10.2或更高版本中执行此操作,只需使用lag窗口函数:

select date_time, value from (
    select date_time, value, lag(value) over (order by date_time) previous_value
    from mysterytable
) mysterytable_with_lag
where value != previous_value
order by date_time
如果要在where子句的值为1时包含最早的行,可以选择将or值和previous_值添加到where子句

对于早期版本,可以使用变量模拟滞后函数:

select date_time, value from (
    select date_time, value, previous_value
    from (select @previous_value := null) initvars
    cross join (
        select date_time, @previous_value previous_value, @previous_value := value value
        from mysterytable
        order by date_time
    ) mysterytable_post_initvars
) mysterytable_with_lag
where value != previous_value
order by date_time

您的数据库服务器是什么版本的?表中是否有任何内容表明什么进程是什么?此外,如果您显示“显示创建表”的输出yourtablename、一些用于创建样本数据的插入以及该样本数据的预期输出,则帮助会容易得多。@ysth添加了样本数据和样本输出,因此您似乎对2020-02-19 00:10:00做出了反应。1行位于“12:00”和“13:00”行之间。但是,数据中没有任何内容提供您显示的顺序;如果按日期和时间排序,则它不在其他行之间。是否存在一些不是日期时间的基本顺序?您使用的是哪个版本的mysql或mariadb?这是非常重要的。
    SET @row_number = 0;
    select a.num, a.date_time, a.value from (
        SELECT (@row_number:=@row_number + 1) AS num, date_time, value
        FROM table1 
        where date_time >= '2020-02-19 00:00:00' and date_time <= '2020-02-25 23:59:00') as a
    where a.num = @result 
    order by a.date_time limit 1;
-- Identify last row with value 1
    SET @row_number = 0, @result = 0;
    select @result := (a.num + 1) as next_rec, a.num, a.date_time, a.value from (
        SELECT (@row_number:=@row_number + 1) AS num, date_time, value
        FROM table1 
        where date_time >= '2020-02-19 00:00:00' and date_time <= '2020-02-23 23:59:59') as a
    where a.value = 1 
    order by a.date_time desc limit 1;
-- Check if value for next rec is 0 to identify end time
    SET @row_number = 0;
    select a.num, a.date_time, a.value from (
        SELECT (@row_number:=@row_number + 1) AS num, date_time, value
        FROM table1 
        where date_time >= '2020-02-19 00:00:00' and date_time <= '2020-02-23 23:59:59') as a 
    where a.num = @result
    order by a.date_time limit 1;
select date_time, value from (
    select date_time, value, lag(value) over (order by date_time) previous_value
    from mysterytable
) mysterytable_with_lag
where value != previous_value
order by date_time
select date_time, value from (
    select date_time, value, previous_value
    from (select @previous_value := null) initvars
    cross join (
        select date_time, @previous_value previous_value, @previous_value := value value
        from mysterytable
        order by date_time
    ) mysterytable_post_initvars
) mysterytable_with_lag
where value != previous_value
order by date_time