06. marts 2014 - 21:48Der er
7 kommentarer og 2 løsninger
Find ledigt værelse
Hej gutter,
Jeg er igang med et simpelt bookingsystem (hehe) hvor jeg til hver booking, kan booke nogle forskellige værelser. En booking består af en record i booking-tabellen, samt en record pr. værelse der er booket i Vaerelsesbookinger tabellen. Tabellerne ser således ud:
Bookinger id - int bookingnummer - int fradato - smalldatetime tildato - smalldatetime
Vaerelsesbookinger id - int bookingId - int vaerelseId - int
Vaerelser id - int navn - varchar beskrivelse - varchar osv.
Der kan altså ligge en masse bookinger med til- og fra-datoer, og jeg har brug for at kunne findet et ledigt værelse ved at angive en til- og fra-dato som der skal søges på. Jeg skal have returneret værelses-id'er.
Er der nogen der er skarpe og lige kan gennemskue den? På forhånd tusind tak!
Jeg forstår problemstillingen således: Du har en ny-tildato og en ny-fradato. Et værelse er ikke ledigt, hvis enten ny-tildato ligger mellem tildato og fradato eller ny-fradato ligger mellem tildato og fradato.
Jeg kunne forestille mig en løsning i denne retning, ikke testet fordi jeg ikke har mssql installeret:
SELECT id FROM Vaerelser WHERE id NOT IN( SELECT vaerelsesId FROM Vaerelsesbookinger v JOIN Bookinger b ON v.bookingId = b.id WHERE ny-tildato BETWEEN fradato AND tildato OR ny-fradato BETWEEN fradato AND tildato)
Synes godt om
Slettet bruger
07. marts 2014 - 09:18#2
Kan skrives sådan:
select v.vaerelseId from Vaerelsesbookinger v where not exists (select null from Bookinger b where b.bookingnummer = v.bookingid and b.tildato <= <fradato> and b.fradato >= <tildato> )
Synes godt om
Slettet bruger
07. marts 2014 - 10:07#3
Det var forkert - prøv dette:
select a.Id from Vaerelser a where not exists (select null from from Vaerelsesbookinger v, Bookinger b where v.vaerelseId = a.Id and b.bookingnummer = v.bookingid and b.tildato <= <fradato> and b.fradato >= <tildato> )
rahp, den må du vist hellere kikke på endnu en gang. Jeg går ud fra, at <fradato> og <tildato> er henholdsvis start og slut datoen for en ny booking. Så vil det ikke kunne lade sig gøre, at tildatoen for en eksisterende booking er tidligere end <fradato> samtidig med at fradatoen for den samme eksisterende booking ligger efter <tildato> . Yderligere refererer du i din subselect til alias a (a.Id) uden definere en sådan alias. (Definitionen Vaerelser a ligger udenfor subselecten.)
Synes godt om
Slettet bruger
08. marts 2014 - 19:41#5
Prøv det - det virker!
Synes godt om
Slettet bruger
09. marts 2014 - 09:59#6
Et lidt længere svar:
Subselect finder bookinger der ligger i samme periode som man ønsker at lave en ny booking i. Derfor skal disse bookinger begynde før den ny booking slutter (fra dato <= ny til dato) og slutte efter den ny booking starter (til dato >= ny fra dato). Ved at bruge not exists findes alle værelser der ikke er booket i perioden. Man kan godt joine med tabeller der ligger uden for subselect.
mishrah, kom du fra det igen? Du oprettede spørgsmålet, du fik et antal indlæg, men så har du ikke været inde siden. Hvis problemet ikke længere er aktuelt, så luk spørgsmålet igen, i overensstemmelse med Ekspertens regler. Ellers kom venligst ind og reager på indlæggene og fortæl din videre hensigt.
Hej igen gutter, Jeg kom ikke fra det, men var lige out-of-town et par dage :)
Jeg kom selv frem til følgende, der minder meget om begge Jeres forslag. Det vigtige er at huske at de datoer man tjekker mod skal være enten between bookingdatoer, ELLER indenfor bookingdatoer, hvor sidstnævnte er nem at glemme :)
Jeg kom frem til følgende: SELECT id FROM Vaerelser WHERE id NOT IN (
SELECT Vaerelsesbookinger.vaerelsesId FROM Bookinger INNER JOIN Vaerelsesbookinger ON Bookinger.id = Vaerelsesbookinger.bookingId WHERE (fra BETWEEN '<fradato>' AND '<tildato>') OR (til BETWEEN '<fradato>' AND '<tildato>') OR (fra<='<fradato>' AND til>='<tildato>')
)
Hvis i lige smider svar, så kan i dele pointene? Jeg mener begge Jeres løsninger vil have løst opgaven med lidt tweaking :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.