मैंने दी गई सीमा के साथ प्रतिच्छेद करने वाली सभी तिथि सीमाओं को इकट्ठा करने के लिए निम्नलिखित SQL के साथ शुरुआत की:
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
यह केवल पहला भाग है। आगे आपको संभावित अतिव्यापनों पर काम करना होगा; एसक्यूएल के साथ ऐसा करना व्यावहारिक नहीं होगा, इसलिए मैं इसे PHP में करने का सुझाव दूंगा।
दुर्भाग्य से मैं जो सामान्य एल्गोरिथ्म चुनूंगा वह ओ (एन ** 2) है, यह इस प्रकार है:
- क्षैतिज अक्ष के रूप में समय के साथ एक समयरेखा (प्रत्येक दिन द्वारा निर्धारित) बनाएं
- प्रत्येक दिनांक/समय सीमा पर पुनरावृति करें और प्रत्येक संभावित क्रमपरिवर्तन के समय खंड बनाने के लिए इसके बाएं और दाएं किनारे के समय को चिह्नित करें।
- सेगमेंट का उपयोग करके, आप ओवरलैप के लिए लंबवत योग करते हैं और आप दैनिक अधिकतम लेते हैं।
आशा है कि यह मदद करता है।