Comecei com o seguinte SQL para reunir todos os intervalos de datas que se cruzam com o intervalo fornecido:
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
Fiddle
Esta é apenas a primeira parte. Em seguida, você precisa descobrir as possíveis sobreposições; isso não seria prático para fazer com SQL, então eu sugiro fazer isso em PHP.
O algoritmo genérico que eu escolheria infelizmente é O(n**2), é assim:
- criar uma linha do tempo (demarcada por cada dia) com o tempo como eixo horizontal
- itere em cada intervalo de data/hora e marque a hora da borda esquerda e direita para criar segmentos de tempo de todas as permutações possíveis.
- usando os segmentos, você soma verticalmente as sobreposições e obtém o máximo diário.
Espero que ajude.