Haría más o menos lo siguiente:
Código SQL:
Ver originalWITH Horas AS
(SELECT '00:00:00' hora_inicio, '01:00:00' hora_fin UNION ALL
SELECT '01:00:00' hora_inicio, '02:00:00' hora_fin UNION ALL
..
..
SELECT '23:00:00' hora_inicio, '24:00:00' hora_fin)
SELECT *
FROM MiTabla T
INNER JOIN Horas H
ON T.hora_fin>=H.hora_inicio
AND T.hora_inicio<=H.hora_fin;
En el CTE Horas deben aparecer todos los rangos de horas.
Toma en cuenta que te vas a obtener muchas duplicaciones de actividades que empezaron en un rango de horas y terminaron en el otro.