Tôi đã bắt đầu với SQL sau để thu thập tất cả các phạm vi ngày giao nhau với phạm vi đã cho:
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
Đây chỉ là phần đầu tiên. Tiếp theo, bạn phải tìm ra những điểm chồng chéo có thể xảy ra; điều này sẽ không thực tế khi làm với SQL, vì vậy tôi khuyên bạn nên làm điều này trong PHP.
Rất tiếc, thuật toán chung mà tôi chọn là O (n ** 2), nó diễn ra như thế này:
- tạo một dòng thời gian (được phân chia theo từng ngày) với thời gian là trục hoành
- lặp lại qua mọi phạm vi ngày / giờ và đánh dấu thời gian của cạnh trái và cạnh phải của nó để tạo các phân đoạn thời gian của mọi hoán vị có thể có.
- bằng cách sử dụng các phân đoạn, bạn tính tổng theo chiều dọc cho các phần chồng chéo và bạn lấy số tiền tối đa hàng ngày.
Hy vọng điều đó sẽ hữu ích.