यहां आपके लिए एक पूर्ण उत्तर देना कठिन है, क्योंकि आप हमें केवल वह तालिका दिखा रहे हैं जिसमें बुकिंग है - हम नहीं जान सकते कि कितने कमरे उपलब्ध हैं।
SQL जो उन कमरों के लिए रूम_आईडी लौटाता है, जो चयनित अवधि के कम से कम भाग के लिए बुक किए गए हैं:
SELECT `room_id` , COUNT(*)
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
GROUP BY `room_id`;
यदि आपके पास कमरों की एक तालिका थी (बुकिंग के बजाय), तो आपके लिए उस अवधि के दौरान बुक नहीं किए गए किसी भी कमरे की सूची लौटाना संभव होगा:
SELECT `id`
FROM `rooms`
WHERE `id` NOT IN (
SELECT DISTINCT( `room_id` )
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
);
संशोधन
ओपी की प्रतिक्रिया के आधार पर, अब धारणाएँ हैं:
- तालिका में उन कमरों का विवरण है जो दिनांक से प्रारंभ होने वाली अवधि के लिए कॉलम
dt
में उपलब्ध हैं। और अगले दिन समाप्त होता है (अर्थात होटल के कमरे) - क्वेरी को किसी भी कमरे को वापस करना चाहिए जो दर्ज की गई अवधि की पूरी अवधि के लिए उपलब्ध हैं (इसलिए केवल डीएवाई ए से डे बी तक उपलब्ध कमरे ही वापस किए जाएंगे।
जैसे, संशोधित कोड है:
SELECT room_id
FROM available_rooms
WHERE dt BETWEEN "[start date]" AND DATE_SUB("[end date]",INTERVAL 1 DAY)
GROUP BY room_id
HAVING COUNT(*)=ABS(DATEDIFF("[start date]","[end date]"));