J'ai commencé avec le SQL suivant pour rassembler toutes les plages de dates qui se croisent avec la plage donnée :
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
Ceci n'est que la première partie. Ensuite, vous devez déterminer les chevauchements possibles ; ce ne serait pas pratique à faire avec SQL, donc je suggérerais de le faire en PHP.
L'algorithme générique que je choisirais est malheureusement O(n**2), il se présente ainsi :
- créer une chronologie (délimitée par chaque jour) avec le temps comme axe horizontal
- itérer sur chaque plage de dates/heures et marquer l'heure de ses bords gauche et droit pour créer des segments temporels de toutes les permutations possibles.
- à l'aide des segments, vous additionnez verticalement les chevauchements et vous prenez le maximum quotidien.
J'espère que ça aide.