Jag började med följande SQL för att samla alla datumintervall som skär det givna intervallet:
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
Detta är bara den första delen. Härnäst måste du räkna ut möjliga överlappningar; detta skulle inte vara praktiskt att göra med SQL, så jag skulle föreslå att du gör detta i PHP.
Den generiska algoritmen jag skulle välja är tyvärr O(n**2), den ser ut så här:
- skapa en tidslinje (avgränsad av varje dag) med tiden som horisontell axel
- itera över varje datum-/tidsintervall och markera tiden för dess vänstra och högra kant för att skapa tidssegment av alla möjliga permutationer.
- när du använder segmenten summerar du vertikalt för överlappningar och tar det dagliga maxvärdet över.
Hoppas det hjälper.