Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Calculando a quantidade total de equipamentos para um intervalo de datas


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.