Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/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_Datetime_Subtraction - Fatal编程技术网

MySQL查询如何在多个条件下减去不同行但相同列中的datetime

MySQL查询如何在多个条件下减去不同行但相同列中的datetime,mysql,datetime,subtraction,Mysql,Datetime,Subtraction,我有下表,在我开始计算警报3开始触发和结束触发的持续时间之前,我需要按照相同的日期和相同的地点进行过滤,前提是警报3在其启动时间的最大60秒的时间间隔内始终紧跟着警报6,这意味着报警3和报警6的开始时间间隔必须始终在60秒以内 site | alarm | start | end -----| ------| --------------------| ------------------- A | 3 | 2020-01-03 22:25:16 |

我有下表,在我开始计算警报3开始触发和结束触发的持续时间之前,我需要按照相同的日期和相同的地点进行过滤,前提是警报3在其启动时间的最大60秒的时间间隔内始终紧跟着警报6,这意味着报警3和报警6的开始时间间隔必须始终在60秒以内

site | alarm | start               | end 
-----| ------| --------------------| ------------------- 
A    | 3     | 2020-01-03 22:25:16 | 2020-01-03 22:25:46 
A    | 6     | 2020-01-03 22:25:26 | 2020-01-03 22:35:26
A    | 5     | 2020-01-03 10:25:16 | 2020-01-03 10:26:26
A    | 3     | 2020-01-03 12:25:16 | 2020-01-03 12:26:26 
B    | 3     | 2020-01-04 22:22:16 | 2020-01-04 22:22:59
B    | 6     | 2020-01-04 22:22:40 | 2020-01-04 22:25:26  
我希望得到如下结果表:

site | alarm | start               | end                 | duration(seconds)
-----| ------| --------------------| --------------------| --------
A    | 3     | 2020-01-03 22:25:16 | 2020-01-03 22:25:46 | 30
A    | 6     | 2020-01-03 22:25:26 | 2020-01-03 22:35:26 | 
B    | 3     | 2020-01-04 22:22:16 | 2020-01-04 22:22:59 | 43
B    | 6     | 2020-01-04 22:22:40 | 2020-01-04 22:25:26 |  

试试这个。。这可能会解决问题:)

试试这个。用表名替换报警

SELECT 
    site,
    alarm,
    start,
    end,
    CASE
        WHEN TIMESTAMPDIFF(SECOND, START, END) <= 60 THEN TIMESTAMPDIFF(SECOND, START, END)
        ELSE NULL
    END AS duration
FROM
    Alarms
WHERE
    alarm IN (3 , 6)
ORDER BY site,alarm;
选择
地点,
警报,
开始
完,,
案例

当TIMESTAMPDIFF(秒,开始,结束)Hi时,实际上60s的限制是指报警3和报警6之间的开始时间。因此,如果开始时间的时间间隔在60秒以内,则我可以继续计算报警3的开始时间和结束时间之间的时间差,同时过滤掉其余时间。在第一行持续时间的结果中,结束时间“22:25:46”在数据中不可用。你能解释一下吗?嗨,很抱歉弄错了,已经更正并更新了。请帮忙!您好,60秒的限制实际上是指同一站点的警报3和警报6之间的开始时间。因此,如果他们的开始时间间隔在60秒内,那么我可以继续计算报警3的开始时间和结束时间之间的时间差
SELECT 
    site,
    alarm,
    start,
    end,
    CASE
        WHEN TIMESTAMPDIFF(SECOND, START, END) <= 60 THEN TIMESTAMPDIFF(SECOND, START, END)
        ELSE NULL
    END AS duration
FROM
    Alarms
WHERE
    alarm IN (3 , 6)
ORDER BY site,alarm;