Вы можете получить даты как:
select date_trunc('day', date_time) as theday, user_id, action_id,
min(date_time) filter (where action = 'start') as start_time,
max(date_time) filter (where action = 'stop') as stop_time
from t
group by theday, user_id, action_id;
В таком случае продолжительность - это разница между ними, но точная логика зависит от того, как вы хотите видеть продолжительность.