В ожидании уточнения точных требований я подумал, что я бы предложил другой подход. Я положу плюсы и минусы с этим ...
Если время начала обычно в определенное время или около него (ваши примеры всегда были на получасе или на часе), тогда вы можете просто разделить все времена начала на то, в какой «полосе» они находятся, и затем посчитать количество разных полос.
например, 00: 00-00: 30 = группа 1
00: 30-01: 00 = группа 2
...
07: 00-07: 30 = группа 15
...
23: 30-00: 00 = группа 48
Чтобы получить группы, вам просто понадобится простое (хотя и довольно длинное) описание случая.
Основная проблема этого подхода заключается в том, что он падает, когда ваше время приближается к порогу. например, 07:29 и 07:31 были бы в двух разных группах, но на самом деле они разнесены на 2 минуты. Это можно немного смягчить, если вы начинаете примерно в одно и то же время, заставляя свои группы начинать и заканчивать в 15 и 45 минут после каждого часа. Тогда, если время начала все в середине группы, тогда вы получите это в основном правильно ...
Хотя, на мой взгляд, проблема не в том, что подходит для SQL, так что если вы можете сделать это на другом языке, который может быть лучше ...
Возможно, вы могли бы сделать это в SQL с некоторыми хитрыми соединениями, но я не способен написать для него надежный SQL ... Алгоритмически, хотя вы хотите сделать следующее.
1) примите самое раннее время начала дня и назовите его своим первым временем запуска.
2) возьмите следующее самое раннее время, которое по крайней мере на 30 минут позже, чем время из вашего предыдущего шага.
3) Повторите шаг 2, пока не закончится время.
4) Подсчитайте время.
Проблема с этим с точки зрения SQL состоит в том, что он пытается создать данные, основанные на предыдущей строке, что будет означать работу с курсорами для циклического прохождения вашего времени и сохранения вещей в переменных.