27. oktober 2010 - 14:44Der er
25 kommentarer og 1 løsning
reservationskonflikter
Hej
Jeg har en database som skal bruges til at reservere køretøjer i. Disse køretøjet kan ikke reserveres flere gange på samme tid, hvorfor det er nødvendigt at lave et sql udtræk som kan kontrollere om køretøjet er reserveret i forvejen. Dette udtræk kan jeg ikke finde ud af at lave og derfor beder jeg om hjælp.
Select * from reservationstabel where Køretøjsid = @id AND ((@resvStartDato BETWEEN ReservationsStartdato AND ReservationsSlutdato) OR (@resvSlutDato BETWEEN ReservationsStartdato AND ReservationsSlutdato))
Den fungerer hvis Startdato eller slutdatoen for en reservation ligger mellem 07-09 men ikke hvis de ligger uden for ex. 0600-1000.
Jeg har lige nærlæst den igen, og jeg kan se at du har et problem ved at bruge Between da en reservation vel godt kan starte før en tidligere reservation og vare længere end den tidligere reservation, så jeg tror du er nødt til at lave nogle flere tjeks som f.eks:
(@resvStartDato < ReservationsStartdato AND @resvSlutDato >= ReservationsStartdato) Or
Hvad er: "Den fungerer hvis Startdato eller slutdatoen for en reservation ligger mellem 07-09 men ikke hvis de ligger uden for ex. 0600-1000."
Første virker som en dato, men det andet er et tidspunkt på en dag eller ?
Gerne lave et lille dump af din DB ... og struktur, så kan vi nemmere oprette det i vores ende, så vi ved præcis at vi arbejder på det samme.
Men går ud fra du vil tage alle de biler som er fri i den periode kunden vil leje en bil.
Ergo: Tag alle biler hvor @resvStartDato er længere ude i fremtiden end slutdato eller Tag alle biler hvor @resvSlutDato er længere tilbage end startdato.
Select * from reservationstabel where Køretøjsid = @id AND ( ReservationsSlutdato <= @resvStartDato OR ReservationsStartdato >= @resvSlutDato )
Jeg vil tro at den her vil fange dem alle, prøv lige at teste flere eksempler, jeg tror det vil virke:
Select * from @reservationstabel where Køretøjsid = @id AND ( (@slut < SlutDato AND @slut > StartDato) OR (@start < StartDato AND @slut > StartDato) OR (@start > StartDato AND @start < SlutDato) )
Eneste man vil er jo reelt set at finde ud af om bilen er ledig, og det er den kun hvis ens start er efter en anden resSlut ... og ens end er før ResStart.
Man så kan snakke om det skal være <= eller < og > ...
SET @start = CAST('2010-10-20 06:00' AS DATETIME) SET @slut = CAST('2010-10-20 10:00' AS DATETIME) SET @id = 'testbil'
INSERT INTO @reservationstabel (Køretøjsid ,StartDato , SlutDato) SELECT @id,CAST('2010-10-20 05:00' AS DATETIME),CAST('2010-10-20 07:00' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 06:00' AS DATETIME),CAST('2010-10-20 08:00' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 07:00' AS DATETIME),CAST('2010-10-20 09:00' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 08:00' AS DATETIME),CAST('2010-10-20 10:00' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 09:00' AS DATETIME),CAST('2010-10-20 11:00' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 10:00' AS DATETIME),CAST('2010-10-20 12:00' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 11:00' AS DATETIME),CAST('2010-10-20 13:00' AS DATETIME)
Select * from @reservationstabel where Køretøjsid = @id AND ( (@slut < SlutDato AND @slut > StartDato) OR (@start <= StartDato AND @slut > StartDato) OR (@start > StartDato AND @start < SlutDato) )
Buzz > Du har måske ret, men jeg forstod at han ville tjekke om bilen allerede var reserveret i et givent tidsrum, men hvis den skal vendes rundt, så man tjekker om den er ledig (hvilket er mere simpelt) så er din selvfølgelig rigtigt, men det er bare ikke det han spurgte efter ;-)
Jeg vil som bkp siger, checke om en bil er ledig i et givent tidsrum. Jeg prøver bkp's løsning i morgen, nr jeg igen er på arbejde og har adgang til databasen.
Buzzzz > Er det nu også rigtigt ;-) Dit script kigger kun efter om der er reservationer uden for den valgte periode, den tjekker jo ikke om der tilfældigvis også er en reservation inden for perioden, så hvilket resultat vil dit script give hvis der både er en reservation uden for perioden og samtidig er reservation inden for perioden. Tror efter længere spekulationer at min er den mest sikre måde ;-) HVIS du vil sikre dig at der ikke er reservationer i en given periode.... * Der tages forbehold for trykfejl (eller manglende logik), da jeg også er træt nu :-)
Hvis tidspunktet .. end start eller end er inden for den rækkefølge vil den returnere de rows, som gør at bilen ikke kan lejes ud: DECLARE @reservationstabel TABLE ( Køretøjsid Nvarchar(10), StartDato datetime, SlutDato datetime ) DECLARE @Start DATETIME DECLARE @End DATETIME DECLARE @id nvarchar(10)
SET @Start = CAST('2010-10-20 08:01' AS DATETIME) SET @End = CAST('2010-10-20 09:00' AS DATETIME) SET @id = 'testbil'
INSERT INTO @reservationstabel (Køretøjsid ,StartDato , SlutDato) SELECT @id,CAST('2010-10-20 04:00' AS DATETIME),CAST('2010-10-20 05:00' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 07:00' AS DATETIME),CAST('2010-10-20 08:00' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 10:00' AS DATETIME),CAST('2010-10-20 11:00' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 13:00' AS DATETIME),CAST('2010-10-20 14:00' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 16:00' AS DATETIME),CAST('2010-10-20 17:00' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 19:00' AS DATETIME),CAST('2010-10-20 20:00' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 22:00' AS DATETIME),CAST('2010-10-20 23:00' AS DATETIME)
Select * from @reservationstabel where Køretøjsid = @id AND ( (@Start BETWEEN StartDato AND SlutDato) OR (@End BETWEEN StartDato AND SlutDato) )
Ja ja, mine testdata er uden logik, ved det godt. Fokuserede mere på selve select statement ... Men er træt nu, tjekker din udgave i morgen, men umiddelbart lyder det rigtigt.
Men jeg tror nu også jeg ville opbygge sådan en table på en anden måde ... men igen, da jeg ikke har prøvet det endnu, ved jeg ikke om det bliver mere praktisk af den grund :-)
SET @start = CAST('2010-10-20 09:01' AS DATETIME) SET @slut = CAST('2010-10-20 10:00' AS DATETIME) SET @id = 'testbil'
INSERT INTO @reservationstabel (Køretøjsid ,StartDato , SlutDato) SELECT @id,CAST('2010-10-20 05:00' AS DATETIME),CAST('2010-10-20 06:00' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 06:00' AS DATETIME),CAST('2010-10-20 07:00' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 07:00' AS DATETIME),CAST('2010-10-20 08:00' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 08:00' AS DATETIME),CAST('2010-10-20 09:10' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 09:11' AS DATETIME),CAST('2010-10-20 09:25' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 09:26' AS DATETIME),CAST('2010-10-20 09:45' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 09:46' AS DATETIME),CAST('2010-10-20 10:10' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 10:11' AS DATETIME),CAST('2010-10-20 11:00' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 11:00' AS DATETIME),CAST('2010-10-20 12:00' AS DATETIME)
Select * from @reservationstabel where Køretøjsid = @id AND ( (@slut < SlutDato AND @slut > StartDato) OR (@start <= StartDato AND @slut > StartDato) OR (@start > StartDato AND @start < SlutDato) )
SET @Start = CAST('2010-10-20 08:01' AS DATETIME) SET @End = CAST('2010-10-20 09:00' AS DATETIME) SET @id = 'testbil'
INSERT INTO @reservationstabel (Køretøjsid ,StartDato , SlutDato) SELECT @id,CAST('2010-10-20 07:00' AS DATETIME),CAST('2010-10-20 08:00' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 08:30' AS DATETIME),CAST('2010-10-20 08:45' AS DATETIME) UNION SELECT @id,CAST('2010-10-20 10:00' AS DATETIME),CAST('2010-10-20 11:00' AS DATETIME) UNION
Select * from @reservationstabel where Køretøjsid = @id AND ( (@Start BETWEEN StartDato AND SlutDato) OR (@End BETWEEN StartDato AND SlutDato) )
Så burde han jo slet ikke lave et reservations system, papiret har jo været brugt tidligere :-)
Synes godt om
Ny brugerNybegynder
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.