मैंने उपलब्ध कमरों को खोजने के बारे में कुछ लेख पढ़े हैं, हालाँकि मैं अपने संस्करण को काम नहीं कर पा रहा हूँ।

क्या कोई मेरे एसक्यूएल पर एक नज़र डाल सकता है और शायद मेरी समस्या पर कुछ प्रकाश डाल सकता है।

टेबल

RoomTBL(RoomNo, RoomName)
LessonsTBL(LessonID, RoomID, StaffID, TimeSlot)
DatesTBL(DateID, LessonID, startDate, endDate)

मैं किसी विशेष TimeSlot पर StartDate और EndDate के बीच उपलब्ध कमरे खोजना चाहता हूँ। (यह एक स्कूल के लिए एक ब्लॉक बुकिंग प्रणाली है)

मैं प्रयास कर चुका हूं

SELECT RoomNumber 
FROM RoomTBL 
WHERE RoomNumber NOT IN (SELECT RoomNumber 
                   FROM LessonsTBL LT 
                   JOIN DatesTBL DT ON LT.LessonID = DT.LessonID  
                   Where(DT.startDate <= '2016-03-21' AND DT.endDate >= '2016-03-21') 
                   OR (DT.startDate < '2016-04-21' AND DT.endDate >= '2016-04-21') 
                   OR ('2016-03-21' <= DT.startDate AND '2016-04-21' >= DT.startDate)
                   AND LT.TimeSlot = 1)

लेकिन यह किसी भी कमरे को वापस नहीं करता है (मेरे पास 6 कमरे उपयोग में नहीं हैं) मुझे आशा है कि मैंने इस मुद्दे को सही ढंग से समझाया है।

इसमें कोई शक नहीं कि मुझे कुछ याद आ रहा है, धन्यवाद।

sql
0
Chris Devine 17 जिंदा 2017, 23:17
यहाँ Timeslot क्या है?
 – 
LONG
17 जिंदा 2017, 23:29
मेरे पास 24 अलग-अलग आधे घंटे के समय स्लॉट हैं, मैं उन्हें केवल 1 से 24 तक नंबर देता हूं। इसलिए कार्य प्रणाली में मैं चयनित टाइमलॉट को पास करूंगा (मैंने परीक्षण के लिए 1 में अभी जोड़ा है) मैंने समय स्लॉट के बिना भी परीक्षण किया है और अभी भी कोई परिणाम नहीं है .
 – 
Chris Devine
17 जिंदा 2017, 23:31
आपको नमूना डेटा और अपेक्षित आउटपुट प्रदान करने की आवश्यकता है। आपका डिज़ाइन संदिग्ध लगता है क्योंकि आपकी तिथियां पाठ द्वारा निर्धारित की जाती हैं, कमरे से नहीं। और ऐसा लगता है कि आपके पास 2 तरीके हैं जिनसे आप ""कमरे उपयोग में नहीं हैं" की पहचान करने का प्रयास कर रहे हैं।
 – 
Disillusioned
17 जिंदा 2017, 23:39
अंत में, यदि आपकी क्वेरी शून्य पंक्तियाँ लौटाती है - तो आपकी सबक्वेरी हर एक कमरे पर लौट रही है। यह आपके इस दावे से संबंधित नहीं है कि आपके पास "6 कमरे उपयोग में नहीं हैं"। आप कैसे निर्धारित करते हैं कि किसी विशेष समय पर एक कमरे का उपयोग किया जाता है?
 – 
Disillusioned
17 जिंदा 2017, 23:41
क्रेग यंग, ​​​​आपके उत्तर के लिए धन्यवाद। मैंने इसे इस उदाहरण से लिया है stackoverflow.com/questions/29213183/… केवल अंतर यह है कि मेरे पास प्रत्येक दिन 24 टाइम स्लॉट है, इसलिए मुझे यह देखने की जरूरत है कि क्या यह उस TIMESLOT पर प्रारंभ और समाप्ति तिथि के बीच मुफ़्त है।
 – 
Chris Devine
17 जिंदा 2017, 23:43

1 उत्तर

सबसे बढ़िया उत्तर

मुझे लगता है कि मैं समझ गया हूं कि आप क्या करने की कोशिश कर रहे हैं, लेकिन आप लेसन्सटीबीएल से रूम नंबर (जो कि किसी भी टेबल में फ़ील्ड नहीं है) का चयन करने का प्रयास कर रहे हैं। मैंने इस उत्तर में बहुत सी धारणाएँ बनाई हैं, इसलिए कृपया स्पष्ट करें कि क्या मैंने गलत अनुमान लगाया है।

ऐसा लगता है कि आप एक ऐसे कमरे की तलाश में हैं, जो '2016-03-21' और '2016-04-21' के बीच किसी भी दिन पहली बार बुक नहीं किया गया है।

SELECT RoomID
FROM LessonsTBL
WHERE RoomID NOT IN
 (SELECT RoomID 
  FROM LessonsTBL LT JOIN DatesTBL ON LT.LessonID = DT.LessonID
  WHERE LT.TimeSlot = 1 AND (DT.startDate BETWEEN '2016-03-21' AND '2016-04-21') OR (DT.endDate BETWEEN '2016-03-21' AND '2016-04-21')

जब तक आपको रूमनाम की आवश्यकता न हो, आपको रूमटीबीएल की आवश्यकता नहीं है।

1
WhatEva 18 जिंदा 2017, 00:03
धन्यवाद, मैं इसे काम करने में कामयाब रहा, हालांकि मुझे इसकी आवश्यकता नहीं है- मुझे इसकी आवश्यकता है कि प्रत्येक सप्ताह केवल उसी दिन बुक बुक करें, प्रत्येक दिन तिथियों के बीच नहीं।
 – 
Chris Devine
18 जिंदा 2017, 00:29
क्या ईवा। क्या वैसे भी मैं इस कोड को संशोधित कर सकता हूं ताकि हर दिन केवल उसी दिन (शुरुआत और समाप्ति तिथियों के बीच) हर दिन जांचने के बजाय जांच की जा सके ???
 – 
Chris Devine
18 जिंदा 2017, 00:49