Как насчет этого:
Используйте эту таблицу времен, но с двумя столбцами, содержащими 15-минутные интервалы. Время from_times составляет 15 минут, время to_times - это секунда перед следующим значением from_times. Например, с 12:30:00 до 12: 44: 59.
Теперь возьмите рабочую таблицу вашего человека, которую я здесь назвал «активность», со столбцами start_time и end_time.
Я добавил значения для Алисы и Боба в соответствии с исходным вопросом.
Вот запрос из MySQL:
SELECT HOUR(times.from_time) AS 'TIME', count(*) / 4 AS 'HOURS'
FROM times
JOIN activity
ON times.from_time >= activity.start_time AND
times.to_time <= activity.end_time
GROUP BY HOUR(times.from_time)
ORDER BY HOUR(times.from_time)
что дает мне это:
TIME HOURS
12 0.7500
13 1.0000
14 1.0000
15 1.5000
16 2.0000
17 1.0000
18 1.0000
19 0.7500
выглядит примерно так ...