Это будет работать для MySql 8.0 ,
при условии, что если для входа в систему пользователя нет строки выхода,
тогда текущая дата и время будут использоваться как время выхода из системы для расчета.
Это также отформатирует результат как hh:mm:ss
with
t as (
select t1.username, t1.timestamp login, t2.timestamp logout
from logs t1 inner join (select * from logs where action = 'logout') t2
where
t1.action = 'login'
and
t2.timestamp = (
select min(timestamp) from logs where action = 'logout' and timestamp > t1.timestamp
)
union
select t1.username, t1.timestamp login, now() logout
from logs t1
where action = 'login' and not exists (select 1 from logs where username = t1.username and action = 'logout' and timestamp > t1.timestamp)
),
r as (
select
username,
sum(timestampdiff(SECOND, login, logout)) dur
from t
group by username
),
d as (
select
r.username,
r.dur div 3600 hours,
(r.dur - ((r.dur div 3600) * 3600)) div 60 mins,
mod(r.dur,60) secs
from r
)
select
username,
concat(if(hours < 10, concat('0', hours), hours), ':', lpad(mins, 2, '0'), ':', lpad(secs, 2, '0')) log_time
from d
См. Демоверсию