hej możesz to zrobić np. tak:
tabela:
course_id | course_date | start_time | end_time | reserved_end_time (end_time + 20min)
a w niej data, godzina rozpoczęcia, godzina zakończenia i godzina zakończenia +20min ( bo w tym czasie inny termin nie może się zacząć)
i teraz przy próbie dodania nowego terminu trzeba uwzględnić 3 przypadki:
1. Czas startu nowego terminu nie może znajdować się między startem a zarezerwowanym końcem innego terminu
2. Zarezerwowany koniec(czyli koniec +20min) nowego terminu nie może znajdować się między startem a zarezerwowanym końcem innego terminu
3. nowy termin nie może zaczynać się i kończyć w czasie innego terminu
czyli, sprawdzasz czy któryś z tych przypadków jest spełniony dla wybranej daty, jeżeli poniższe zapytanie zwróci wartość większą niż 0, to znaczy że ten termin kolidowałby z innym:
$new_start_time; // godzina np. 15:30
$new_end_time; // godzina np. 15:30 !!!! tutaj wybrana godzina + doliczone 20min przerwy
$new_course_date; // data
$sql = "SELECT course_id FROM courses WHERE course_date = $new_course_date AND (($new_start_time > start_time AND $new_start_time < reserved_end_time) OR ($new_end_time > start_time AND $new_end_time < reserved_end_time) OR( $new_start_time < start_time AND $new_end_time > end_time))";
oczywiście warto by jeszcze dodać jakiś kalendarzyk z zamalowanymi zajętymi terminami dla zwiększenia usablity