Avatar billede nemlig Professor
20. maj 2011 - 20:24 Der er 9 kommentarer og
1 løsning

Tjek for dobbelt booking + luft mellem 2 perioder

Hejsa.
Jeg har et lille bookingsystem, hvor der ved en ny booking vælges en starttid og en sluttid. Når oplysningerne gemmes, tjekkes der om, der sker overlapning af netop indtastet periode ift. dem der ligger i MySQL i forvejen:

$start_dato = '2011-05-14 10:00:00'; //BLIVER DEFINERET UD FRA INPUT-FELTER
$slut_dato =  '2011-05-16 12:00:00';

//felterne startdato og slutdato er med typen [datetime]

$query = "SELECT `startdato`,`slutdato` FROM `kalender_aftale` WHERE
                (('$start_dato' < `startdato` AND '$slut_dato' > `startdato`)
            OR
                ('$start_dato' <= `startdato` AND '$slut_dato' >= `slutdato`)
            OR
                ('$start_dato' >= `startdato` AND '$slut_dato' <= `slutdato`)
            OR
                ('$start_dato' < `slutdato` AND '$slut_dato' > `slutdato`))
            ORDER BY `startdato`";

$result = database($query);
if(mysql_num_rows($result)>0)
{ //SÅ ER DER DOBBELT BOOKING.

Ovenstående fungerer perfekt.
Nu vil jeg gerne, at der ikke kun skal tjekkes for dobbeltbooking, men jeg vil også sikre, at der er mindst 180 minutter mellem den netop indtastede periode og en evt. eksisterende startdato eller slutdato. Der skal altså være luft på mindst 180 minutter i begge ender.

Minuterne har jeg defineret sådan her:
$antalMinutterMellem = '180';
Jeg anvender PHP.
Nogen forslag?
20. maj 2011 - 21:55 #1
Nej, det kan jeg ikke svare paa (endnu.)  Til gengaeld vil jeg nu svare paa noget du ikke spurgte om (der er nogen der ikke kan lade vaere med at blande sig):  Jeg mener at din soegning efter dobbeltbooking kan rationaliseres ved at bruge BETWEEN.  Der er dobbelt booking, saa vidt jeg forstaar, hvis der i tabellen findes enten en startdato eller en slutdato der ligger mellem den sidst indtastede start og slutdato.  Saa dette burde virke:

$query = "SELECT * FROM nemlig WHERE startdato BETWEEN '$start_dato' AND '$slut_dato'OR slutdato BETWEEN '$start_dato' AND '$slut_dato'";

$result = database($query);
if(mysql_num_rows($result)>0)
{ //SÅ ER DER DOBBELT BOOKING.

og en simplere grund-query goer det i hvertfald ikke svaerere at finde en loesning paa soegning med luft.
20. maj 2011 - 22:00 #2
Jeg skal lige tilfoeje at jeg for at teste min ide oprettede en mysql tabel nemlig, og saa fik jeg ikke rettet til dit tabelnavn kalender.  Men det har du vel allerede gaettet.
Avatar billede neoman Novice
20. maj 2011 - 22:21 #3
Sorry amigos, men begge algoritmerne har vist huller i dem.

http://c2.com/cgi/wiki?TestIfDateRangesOverlap
20. maj 2011 - 22:32 #4
..og, eftersom 180 minutter er 3 timer, maa resten af vejen vel vaere at bruge ADDTIME() og SUBTIME():

$query="SELECT * FROM kalender_aftale WHERE ADDTIME(startdato, '0 3:0:0') BETWEEN '$start_dato' AND '$slut_dato OR SUBTIME(slutdato, '3:0)0') BETWEEN '$start_dato' AND '$slut_dato'";

Hvis nogen mener at have fundet huller i algoritmen saa kvalificer din mening ved at fortaelle hvor hullerne er.
Avatar billede neoman Novice
20. maj 2011 - 22:50 #5
Jeg æder det i mig igen:OP's virker.#1 gør ikke, for den tager ikke hensyn til en overlappende perode kortere end den i db'en.
Avatar billede neoman Novice
20. maj 2011 - 22:54 #6
Fx : hvis der er et interval i db fra 1 til 10, så vil et testinterval af 3 til 4 ikke blive fundte som overlappende.
Avatar billede neoman Novice
20. maj 2011 - 23:01 #7
Anyhoo  -den algoritme jeg linker til har jeg også selv engang nået frem til med lidt tegninger, og implementeret - den er bare simplere. MEn OK, når OP har noget der virker ,så ingen grund til at pille. Beklager forstyrrelsen.
Avatar billede nemlig Professor
20. maj 2011 - 23:32 #8
Jeg har været optaget af andet her til aften, men er nu gået i gang med #4.

Jeg får syntax fejl, og jeg kan også se, at der er noget galt efter SUBTIME(slutdato.....

Jeg er ved at lede efter korrekt syntax på nettet, og vender tilbage.
Avatar billede nemlig Professor
21. maj 2011 - 00:02 #9
Så fungerer det perfekt. Tusind tak for hjælpen Christian_Belgien. Send venligst et svar. Den endelige forespørgsel blev sådan her:

$antalTimer = 2; //Kan justeres efter behov
$antalMinutter = 59; //Kan justeres efter behov

$query="SELECT `startdato`,`slutdato` FROM `kalender_aftale` WHERE
SUBTIME(`startdato`, '".$antalTimer.":".$antalMinutter.":00.000000') BETWEEN '$start_dato' AND '$slut_dato'
OR    
ADDTIME(`slutdato`, '".$antalTimer.":".$antalMinutter.":00.000000') BETWEEN '$start_dato' AND '$slut_dato'";
21. maj 2011 - 06:23 #10
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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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