Saya mulai dengan SQL berikut untuk mengumpulkan semua rentang tanggal yang bersinggungan dengan rentang yang diberikan:
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
Ini hanya bagian pertama. Selanjutnya Anda harus mencari kemungkinan tumpang tindih; ini tidak praktis untuk dilakukan dengan SQL, jadi saya sarankan untuk melakukan ini di PHP.
Sayangnya, algoritma generik yang akan saya pilih adalah O(n**2), seperti ini:
- buat garis waktu (dibatasi oleh setiap hari) dengan waktu sebagai sumbu horizontal
- ulangi setiap rentang tanggal/waktu dan tandai waktu tepi kiri dan kanannya untuk membuat segmen waktu dari setiap kemungkinan permutasi.
- menggunakan segmen, Anda menjumlahkan secara vertikal untuk tumpang tindih dan mengambil jumlah maksimum harian.
Semoga membantu.