Ho l'impressione che si tratti di un buffer circolare perché l'ultimo elemento dell'id_utente diventa il primo id mentre tutti gli altri id_utente vanno assegnati all'id successivo all'originario.
il controllo che dovrai fare è che se l'orario inizio del nuovo appuntamento è compresa tra inizio e fine sul db e la data fine è compresa tra inizio e fine e maggiore di 17 allora è full l'orario che stai scegliendo. una cosa del genere. così tu stai usando solo l'ora di start e mai l'ora di end.