Avatar billede martens Guru
30. november 2017 - 21:59 Der er 7 kommentarer og
1 løsning

Finde perioder, hvor der er IKKE er booket

Jeg har et udtræk fra en større bookingdatabase ( køretøjer ) hvor jeg kan se hvornår køretøjerne er booket.

Start Dato - Start Klokken  - Stop Dato - Stop Klokken - Registreringsnummer samt Type Køretøj ( alm bil / stor bil / kassevogn )

Er der et kvikt hoved, der kan hjælpe med at komme med et bud på, hvordan jeg kan lave en forespørgsel, der kan vise hvornår køretøjerne IKKE er booket, så jeg eksempelvis kan lave en søgning på eksempelvis kassevogne, der ikke er booket i UGE 7 i 2018

mvh martens
Avatar billede bvirk Guru
01. december 2017 - 00:02 #1
Det med at dele et tidspunkt op i to felter - et til datodelen og et til tidspunktet på dagen, er unødvendigt.
Nå, det var ikke det spørgsmålet gik på, så lad antage at start=start dato+start klokken og tilsvarende for slut.

select registreringsnummer from Køretøjer
WHERE not registreringsnummer in (select registreringsnummer from Køretøjer where  start >= dateAdd("ww",uge-1,#1-1-2018#) and  slut <= dateAdd("ww",uge,#1-1-2018#)) and vogntype=[type køretøj]

(ikke testet)
Avatar billede terry Ekspert
01. december 2017 - 17:45 #2
bvirk is on to the right idea, but it needs more checks to be correct.

Here's one link which discusses the issue, I'm sure there ar many more.
https://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap

My idea:
Check if start is between both dates of week 7
>= dateAdd("ww",7-1,#2018/01/01#) (12/02/2018)
< dateAdd("ww",7,#2018/01/01#)  (19/02/2018) 19th is week 8 so must be less but not =

Do the same for slut date.

Now you need to check if the start is less than 1st day of week 7 and slut date is greater than last day of week 7.

But again, not tested :-)
Avatar billede terry Ekspert
01. december 2017 - 17:46 #3
Oh, the last check is to check for total overlap over period.
Avatar billede martens Guru
02. december 2017 - 01:54 #4
Mange tak for jeres gode forslag
Jeg har testet bvirk´s forslag og langt hen ad vejen virker det som jeg havde håbet på..
Så foreløbigt tak for det.
Terry har også ret i selve valideringen

Måske jeg ikke skal læne mig op af UGE-funktionen, men snarere en startdato med klokkeslæt og en slutdato og klokkeslæt

Jeg har to tabeller, der i min optik er relevante
En med alle køretøjerne tbl_cars og en med de eksisterende bookinger på køretøjerne tbl_bookings
Det er jo nødvendigvis ikke alle køretøjer der vil være booket, så der vil i køretøjstabellen være ledige køretøjer, der ikke fremgår af bookingtabellen.
Jeg overvejer at cleane de data jeg har og lave en DUMMY-database  med data, der ligner den virkelighed jeg roder rundt i.
Ofte har vi kunder, der ønsker et/eller flere køretøj/er i en give periode  ( kan være forskellige typer, det drejer sig om ) så en hurtig udsøgning vil være mere end guld værd !

Jeg vender snarest muligt tilbage med data I kan ”rode” med…

mvh martens
Avatar billede terry Ekspert
02. december 2017 - 11:40 #5
"Måske jeg ikke skal læne mig op af UGE-funktionen"
Week or date, the method of finding those NOT booked in a given period is the same.

"Ofte har vi kunder, der ønsker et/eller flere køretøj/er i en give periode  "

No problem, just remove
"and vogntype=[type køretøj]" from SQL
Avatar billede martens Guru
02. december 2017 - 12:51 #6
Hvis jeg nu vil finde de ledige køretøjer i perioden MAN 4 DEC 2017 06:00 til og med SØN 17 DEC 2017 18:00 skal jeg da ikke benytte mig af UGE(WEEK) funktionen... eller hvad ?

>>  terry

"and vogntype=[type køretøj]" er jo der, hvor køretøjstypen bliver valgt ( om det er en lille bil, stor bil ( lille BUS ) eller om det eksempelvis er en kassevogn.
Avatar billede terry Ekspert
02. december 2017 - 13:05 #7
"Hvis jeg nu vil finde de ledige køretøjer i perioden MAN 4 DEC 2017 06:00 til og med SØN 17 DEC 2017 18:00 skal jeg da ikke benytte mig af UGE(WEEK) funktionen... eller hvad ?"

No need for week number just test for date & time

"and vogntype=[type køretøj]"
If you want to see all types which are not booked then you dont need to include this in SQL. But if you are interested in only seeing a specific type then you need to include ..
Avatar billede terry Ekspert
02. december 2017 - 14:03 #8
OK, here is some SQL you can play around with, you need to alter table/field names as required. It finds Registreringsnummer which ARE in use in the period you gave in #6

SELECT tblkøretøjer.Registreringsnummer, tblkøretøjer.TypeKøretøj, tblkøretøjer.StartDateTime, tblkøretøjer.StopDateTime
FROM tblkøretøjer
WHERE (tblkøretøjer.StartDateTime>=#12/4/2017 6:0:0# And tblkøretøjer.StartDateTime<=#12/17/2017 18:0:0#) OR (tblkøretøjer.StopDateTime>=#12/4/2017 6:0:0# And tblkøretøjer.StopDateTime<=#12/17/2017 18:0:0#) OR (tblkøretøjer.StartDateTime<=#12/4/2017 6:0:0# AND tblkøretøjer.StopDateTime>=#12/17/2017 18:0:0#);


Once this works you only need to add the out select to give you those which ARE NOT in use in the period

select Registreringsnummer from tblkøretøjer
WHERE not Registreringsnummer in
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