Avatar billede mishrah Nybegynder
06. marts 2014 - 21:48 Der 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!

Med venlig hilsen
Martin
07. marts 2014 - 06:48 #1
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)
Avatar billede 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>
)
Avatar billede 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>
)
07. marts 2014 - 17:23 #4
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.)
Avatar billede Slettet bruger
08. marts 2014 - 19:41 #5
Prøv det - det virker!
Avatar billede 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.
12. marts 2014 - 00:56 #7
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.
Avatar billede mishrah Nybegynder
17. marts 2014 - 10:19 #8
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 :)

Endnu engang tusind tak for hjælpen.
Mvh Martin
17. marts 2014 - 12:15 #9
I så fald svar fra mig.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester