Zacząłem od następującego kodu SQL, aby zebrać wszystkie zakresy dat, które przecinają się z podanym zakresem:
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
To tylko pierwsza część. Następnie musisz wypracować możliwe nakładanie się; nie byłoby to praktyczne w przypadku SQL, więc sugerowałbym zrobienie tego w PHP.
Ogólny algorytm, który wybrałbym, to niestety O(n**2), wygląda to tak:
- utwórz oś czasu (oddzieloną każdym dniem) z czasem jako osią poziomą
- iteruj po każdym zakresie dat/czasów i zaznacz czas jego lewej i prawej krawędzi, aby utworzyć segmenty czasowe każdej możliwej permutacji.
- używając segmentów, sumujesz w pionie dla nakładania się i bierzesz dzienne maksimum w poprzek.
Mam nadzieję, że to pomoże.