20. maj 2011 - 20:24Der 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?
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
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.
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.
..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.
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.
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'";
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.