Hallo ICT'ers,
Ik ben bezig met een project voor een zwembad die een rooster website wil hebben. Het moet hier mogelijk zijn om een rooster te maken en daarbij moeten medewerkers voorkeuren voor het rooster kunnen opgeven. Dit alles werkt, maar met het weergaven van de voorkeuren bij de juiste datum stuit ik op een probleem: hij geeft momenteel de voorkeur ook weer op 1 en 2 dagen eerder, terwijl dat niet zou moeten. De SQL van de voorkeuren ziet er zo uit:
id - int(250)
user - int(250)
period - int(250)
date_from - datetime
date_to - datetime
reason - int(1)
reason_desc - varchar(50)
Stel je voor een medewerker geeft een voorkeur op dat hij een hele dag vrij wenst te zijn, in de database komt er dan een record bij:
id - 1
user - 5
period - 6 (verwijst naar de periode waar het rooster in loopt)
date_from - 2016-08-10 00:00:00
date_to - 2016-08-10 23:59:59
reason - 1
reason_desc - vrij
Nu moet dit record dus komen bij de juiste te roosteren dag (10 augustus 2016). Het kan echter ook zijn dat er een voorkeur voor een gehele periode opgegeven wordt (meerdere dagen). In elk geval kan elke medewerker per dag (ook al is het maar een voorkeur voor een paar uur op die dag) maximaal één voorkeur opgeven. Het is belangrijk dat als er een voorkeur van 9 augustus 00:00:00 t/m 11 augustus 23:59:59 opgegeven wordt, dat deze dus op zowel 9, als 10, als 11 augustus zichtbaar is en dus uit de tabel gehaald wordt.
De query die ik nu gebruik is deze:
SELECT UNIX_TIMESTAMP(date_from) as van, UNIX_TIMESTAMP(date_to) as tot, reason, reason_desc FROM voorkeuren WHERE user='".$emp_sel['id']."' AND period='".$periode['id']."' AND ((UNIX_TIMESTAMP(date_from) <= '".$date_from."' && UNIX_TIMESTAMP(date_to) >= '".$date_to."') OR (UNIX_TIMESTAMP(date_from) <= '".$date_from."' AND UNIX_TIMESTAMP(date_to) <= '".$date_to."' AND UNIX_TIMESTAMP(date_to) >= '".$date_from."') || (UNIX_TIMESTAMP(date_from) >= '".$date_from."' && (UNIX_TIMESTAMP(date_to) <= '".$date_to."' || UNIX_TIMESTAMP(date_to) >= '".$date_from."'))) ORDER BY date_from ASC LIMIT 1
$date_from verwijst naar een variabele die de UNIX TIMESTAMP van het begin van de dag bevat, bijvoorbeeld die van 10 augustus 00:00:00. $date_to verwijst naar een variabele die de UNIX TIMESTAMP van het einde van de dag bevat, bijvoorbeeld die van 10 augustus 23:59:59.
De entry zoals bovenstaande zorgt er in de bovenstaande query echter voor dat die voorkeur zowel op 8, 9 als 10 augustus zichtbaar is. Hoe zorg ik ervoor dat deze alleen op de 10e zichtbaar is, waarvoor de entry ook bedoeld is?
Ik heb al uren naar de query gekeken maar ik kom er gewoon niet uit.. Wie zou me misschien een handje willen helpen met het oplossen van deze query?
Alvast heel erg bedankt!
Met vriendelijke groet,
Lars Groot