Ho iniziato con il seguente SQL per raccogliere tutti gli intervalli di date che si intersecano con l'intervallo specificato:
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
Questa è solo la prima parte. Successivamente devi elaborare le possibili sovrapposizioni; questo non sarebbe pratico da fare con SQL, quindi suggerirei di farlo in PHP.
L'algoritmo generico che sceglierei è sfortunatamente O(n**2), funziona così:
- crea una sequenza temporale (demarcata da ogni giorno) con l'ora come asse orizzontale
- Esegui l'iterazione su ogni intervallo di data/ora e segna l'ora del bordo sinistro e destro per creare segmenti temporali di ogni possibile permutazione.
- utilizzando i segmenti, sommi verticalmente per le sovrapposizioni e prendi il massimo giornaliero.
Spero di esserti stato d'aiuto.