Začal jsem s následujícím SQL, abych shromáždil všechny rozsahy dat, které se protínají s daným rozsahem:
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
Toto je pouze první část. Dále musíte zjistit možné překryvy; to by nebylo praktické pro SQL, takže bych navrhoval udělat to v PHP.
Obecný algoritmus, který bych zvolil, je bohužel O(n**2), vypadá to takto:
- vytvořte časovou osu (vymezenou každým dnem) s časem jako vodorovnou osou
- iterujte přes každý rozsah data/času a označte čas jeho levého a pravého okraje, abyste vytvořili časové segmenty každé možné permutace.
- pomocí segmentů sčítáte vertikálně za překrytí a přebíráte denní maximum.
Doufám, že to pomůže.