Ik begon met de volgende SQL om alle datumbereiken te verzamelen die het opgegeven bereik kruisen:
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
Dit is pas het eerste deel. Vervolgens moet je de mogelijke overlappingen uitwerken; dit zou niet praktisch zijn met SQL, dus ik raad aan om dit in PHP te doen.
Het generieke algoritme dat ik zou kiezen is helaas O(n**2), het gaat als volgt:
- maak een tijdlijn (afgebakend door elke dag) met de tijd als horizontale as
- herhaal elk datum-/tijdbereik en markeer de tijd van de linker- en rechterrand om tijdsegmenten van elke mogelijke permutatie te maken.
- met behulp van de segmenten somt u verticaal op voor overlappingen en neemt u het dagelijkse maximum over.
Ik hoop dat dat helpt.