Avatar billede wampiro-uha Nybegynder
19. januar 2005 - 14:44 Der er 16 kommentarer og
1 løsning

Check om dato-interval overlapper!

Jeg har en database med en masse aftaler, bestående af datostart og datoslut felter.

Nu vil jeg skrive en tidslinje ud, som for hvert løkke-gennemløb har variablerne $datostart2 og $datoslut2.

Det jeg nu gerne vil finde ud af, er for hvert gennemløb om der findes en aftale til dette tidspunkt.
Dette inkludere hvis en aftale på nogen måde overlapper løkke-gennemløbet.

Nogen idéer? Synes selv jeg har stirret mig blind på problemet, og synes der er utrolig mange forhold at tage hensyn til.
Avatar billede detox Nybegynder
19. januar 2005 - 14:49 #1
Hvis du som udgangspunkt har en database uden overlapninger, kan du tjekke et nyt tidspunkt med:

SELECT * FROM tabel WHERE '$nyt_tidspunkt' BETWEEN datostart AND datoslut
Avatar billede wampiro-uha Nybegynder
19. januar 2005 - 15:19 #2
Men jeg har overlapninger, det er det som er problemet.
Avatar billede wampiro-uha Nybegynder
19. januar 2005 - 15:29 #3
Jeg har prøvet noget ala:

... where ((($datoStart between dato_start and dato_slut) and ($datoSlut between dato_start and dato_slut))
or (($datoStart <= dato_start) and ($datoSlut >= dato_slut))
or (($datoStart <= dato_start) and ($datoSlut between dato_start and dato_slut))
or (($datoSlut <= dato_slut) and ($datoStart between dato_start and dato_slut)))

men det ser ikke ud til at virke? Nogen hjælp?
Avatar billede detox Nybegynder
19. januar 2005 - 15:39 #4
Hmm, måske

... where ($datoStart between dato_start and dato_slut) or ($datoSlut between dato_start and dato_slut)
Avatar billede detox Nybegynder
19. januar 2005 - 15:42 #5
Hvis den så returnerer mere end en række må der være overlapninger.
Avatar billede wampiro-uha Nybegynder
19. januar 2005 - 16:07 #6
Jeg tror jeg har forklaret problemet med overlapninger forkert.
Det jeg mener med overlapninger er ikke at der er to aftaler i DB'en som overlapper, men derimod at en aftale kan overlappe tidsinvervalerne i min løkke.

F.eks. hvis min løkke hopper med et kvarters mellemrum fra kl. 10:00 til 16:00, altså:

10:00 - 10:15
10:15 - 10:30
10:30 - 10:45
10:45 - 11:00
11:00 - ...

Og jeg har så har en aftale i DB'en som ligger fra kl. 10:30 - 12:30, så overlapper den tidsintervallerne i løkken.

Mit problem er så, hvorledes jeg f.eks. kan skrive AFTALE i for hver klokkeslæt som forfindes i en aftale, altså i dette tilfælde:

10:00 - 10:15
10:15 - 10:30
10:30 - 10:45 AFTALE
10:45 - 11:00 AFTALE
11:00 - 11:15 AFTALE
...

? Håber det giver lidt mere idé om mit problem. Hvordan jeg løber løkken igennem og udskriver data hvis der er aftale er ligemeget. Det er bare mit mysql-kald som skal returnere aftalen, hvis den forefindes i $datoStart og $datoSlut :-)
Avatar billede detox Nybegynder
19. januar 2005 - 16:13 #7
Jamen det burde du da osse kunne finde med:

where ($datoStart between dato_start and dato_slut) or ($datoSlut between dato_start and dato_slut)

Hvilken type har felterne i tabellen?
Avatar billede wampiro-uha Nybegynder
19. januar 2005 - 17:30 #8
De har datetime, men jeg kan sagtens sammenligne datotyperne, det er ikke problemet.
Men med dit forslag, vil den ikke spytte nogen række ud, hvis f.eks. $datoStart er ikke ligger imellem dato_start og dato_slut men $datoSlut gør.
Avatar billede wampiro-uha Nybegynder
19. januar 2005 - 17:32 #9
I henhold til ovenstående eksempel vil jeg da også have skrevet:

10:30 - 10:45 AFTALE

hvis jeg har sat $datoStart = 10:25 og $datoSlut = 10:45, det vil dit eksempel da ikke gøre så, da $datoStart ligger uden for dato_start og dato_slut?
Avatar billede wampiro-uha Nybegynder
19. januar 2005 - 17:43 #10
Hovsa, tænker på hvis nu $startDato er mindre end start_dato og $slutDato er størrere end slut_dato?
Avatar billede detox Nybegynder
19. januar 2005 - 17:47 #11
Kunne du så ikke tilføje:

where ($datoStart between dato_start and dato_slut) or ($datoSlut between dato_start and dato_slut) or ($datostart < datostart and $datoslut > datoslut)
Avatar billede wampiro-uha Nybegynder
19. januar 2005 - 17:48 #12
Jeg tager mine ord i mig igen, undskyld mange gange!
Det ser faktisk ud til at virke!!! Sorry!

Sådan går det når man taler før man tænker :-D
Avatar billede wampiro-uha Nybegynder
19. januar 2005 - 17:50 #13
Laver du ikke et svar???

Mit eneste problem er nu at hvis jeg sætter $startDato = 10:30 og $slutDato = 10:45, så skriver den:

10:00 - 10:15
10:15 - 10:30 AFTALE
10:30 - 10:45 AFTALE
10:45 - 11:00 AFTALE
11:00 - 11:15

hvor den kun skulle vælge 10:30 - 10:45, nogen der lige har et tip her ?
Avatar billede wampiro-uha Nybegynder
19. januar 2005 - 17:52 #14
Jeg kan selvfølgelig lægge et sekund til $startDato og trække et fra til $slutDato, men findes der en bedre mere rigtig metode?
Avatar billede detox Nybegynder
19. januar 2005 - 18:05 #15
Tja, det er jp i realiteten osse korrekt. Det med sekundet ville sikkert fungere. Du kunne osse lave dine tider sådan:

10:01 - 10:15
10:16 - 10:30
10:31 - 10:45 AFTALE
10:46 - 11:00
11:01 - 11:15

eller:

10:00 - 10:14
10:15 - 10:29
10:30 - 10:44 AFTALE
10:45 - 10:59
11:00 - 11:14
Avatar billede wampiro-uha Nybegynder
19. januar 2005 - 18:51 #16
jeps, kan godt se det er rigtig nok det den gør. Men tænkte om man kan gøre noget bedre end at lægge et sek. til osv., selvom det virker fint nok :-)

Laver du ikke et svar, og rigtig mange tak for din hjælp og tålmodighed. Jeg var lidt tungnem med dette spm, sorry! :-)
Avatar billede detox Nybegynder
19. januar 2005 - 19:16 #17
Bare i orden :o)
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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