Започнах със следния SQL, за да събера всички периоди от време, които се пресичат с дадения диапазон:
SELECT MAX(available) - IFNULL(SUM(amountInSch), 0)
FROM Table1
LEFT JOIN Table3 USING (eqid)
LEFT JOIN Table2 USING (scheduleid)
WHERE DATE(startDate) <= '2012-08-27' AND DATE(endDate) >= '2012-08-27'
AND endTime > '08:30' AND startTime < '12:00'
AND eqid = 1
Това е само първата част. След това трябва да изработите възможните припокривания; това не би било практично да се направи със SQL, така че бих предложил да направите това в PHP.
Общият алгоритъм, който бих избрал, за съжаление е O(n**2), той е така:
- създайте времева линия (разграничена от всеки ден) с времето като хоризонтална ос
- прегледайте всеки диапазон от дата/час и маркирайте времето на левия и десния му край, за да създадете времеви сегменти от всяка възможна пермутация.
- с помощта на сегментите сумирате вертикално за припокривания и приемате дневния максимум напречно.
Надявам се това да помогне.