Il existe plusieurs approches à cela. L'une utilise des sous-requêtes corrélées. Ce n'est pas très amusant. Au lieu de cela, utilisons la méthode de la somme cumulative car vous avez Oracle.
La clé est de commencer avec une liste d'horodatages avec une valeur de +1 pour un début et -1 pour une fin. C'est facile :
select t.*
from ((select starttime as thetime, 1 as value from table t) union all
(select endtime, -1 as value from table t)
) t
Maintenant, la somme cumulée de la value
vous indique le nombre de chevauchements actifs à un moment donné :
select t.*, sum(value) over (order by thetime) as numactives
from ((select starttime as thetime, 1 as value from table t) union all
(select endtime, -1 as value from table t)
) t
Cela résout votre problème. Vous souhaitez probablement ajouter un order by numactives desc
pour les heures spécifiques.