Comencé con el siguiente SQL para recopilar todos los rangos de fechas que se cruzan con el rango dado:
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
Esta es solo la primera parte. A continuación, debe resolver las posibles superposiciones; esto no sería práctico de hacer con SQL, por lo que sugeriría hacerlo en PHP.
Desafortunadamente, el algoritmo genérico que elegiría es O(n**2), dice así:
- cree una línea de tiempo (demarcada por cada día) con el tiempo como eje horizontal
- itere sobre cada rango de fecha/hora y marque la hora de su borde izquierdo y derecho para crear segmentos de tiempo de cada permutación posible.
- Usando los segmentos, sumas verticalmente para las superposiciones y obtienes el máximo diario transversal.
Espero que ayude.