Попробуйте это:
SELECT t.month_reference as date,
round( sum(if(t_aux.status,1,0)) / 25920) :: numeric, 2) as working_time
# Я полагаю, вы используете этот номер, потому что время работы системы 60 * 18 * 24,
# Я бы использовал это, если бы я хотелобщее количество секунд в месяце 60 * 60 * 24 * день (Last_day (t.month_reference))
FROM (SELECT date_trunc('month', t.date) as month_reference
FROM table
) as t
left join table t_aux
on t.month_reference=date_trunc('month', t_aux.date)
, поэтому, когда мы группируем по месяцам, sum () найдет только те строки, которые являются истинными и имеютуказанный месяц
and t_aux.date <
(select t1.date
from table t1
where t.month_reference=date_trunc('month', t1.date)
and t1.status=false
order by t1.date asc limit 1 )
Я добавляю это, чтобы он выбирал только строки, которые являются истинными, пока не найдет строку со статусом false в том же месячном номере
GROUP BY t.month_reference
ORDER BY t.month_reference;