Нужно иметь две выборки - статусы запусков и статусы остановок по одному из интерфейсов.
Если мы отсечем первый запуск, количество пусков-остановок у нас будет одинаковое (если интерфейс в данный момент работает), при правильной сортировке можно две эти выборки соединить друг с другом по порядковому номеру строки.
MySql под рукой нет, а в Oracle удаление первой строки довольно довольно страшно выглядит (писал на коленке):
with q as (
select 1 as id, 1 as interface, 1 as status, to_date('01.01.2017','dd.mm.yyyy') as dd, to_date('01.01.2017 00:00','dd.mm.yyyy HH24:MI:SS') as time from dual
UNION ALL
select 2 as id, 1 as interface, 2 as status, to_date('01.01.2017','dd.mm.yyyy') as dd, to_date('01.01.2017 18:20','dd.mm.yyyy HH24:MI:SS') as time from dual
UNION ALL
select 3 as id, 1 as interface, 1 as status, to_date('01.01.2017','dd.mm.yyyy') as dd, to_date('01.01.2017 18:30','dd.mm.yyyy HH24:MI:SS') as time from dual
UNION ALL
select 4 as id, 1 as interface, 2 as status, to_date('01.01.2017','dd.mm.yyyy') as dd, to_date('01.01.2017 19:20','dd.mm.yyyy HH24:MI:SS') as time from dual
UNION ALL
select 5 as id, 1 as interface, 1 as status, to_date('01.01.2017','dd.mm.yyyy') as dd, to_date('01.01.2017 21:00','dd.mm.yyyy HH24:MI:SS') as time from dual
)
SELECT SUM(ROUND ( (end_date - begin_date) * 24, 2)) as hours
FROM (
SELECT
q2.id,
q2.status,
q2.time begin_date,
q.time end_date
FROM (SELECT ROWNUM r, q.*
FROM (SELECT ROWNUM rr, q.*
FROM q
WHERE q.interface = 1 AND q.status = 1
ORDER BY time ASC) q
WHERE rr > 1) q
JOIN
( SELECT ROWNUM rr, q.*
FROM q
WHERE q.interface = 1 AND q.status = 2
ORDER BY time ASC ) q2 ON q.dd = q2.dd AND q.interface = q2.interface AND q.r = q2.rr
)
На этих тестовых данных всё верно.