यहां आपके लिए एक पूर्ण उत्तर देना कठिन है, क्योंकि आप हमें केवल वह तालिका दिखा रहे हैं जिसमें बुकिंग है - हम नहीं जान सकते कि कितने कमरे उपलब्ध हैं।
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]"));