Eu tenho que admitir que é assustador tentar desembaraçar essa consulta para entender a lógica por trás dela, mas acho que a consulta a seguir deve retornar os resultados que você precisa.
{thistable}.id IN (
/*Finds booking slots where the booking slot does not overlap
with any of the existing bookings on that day,
or where the booking slot id is the same as the current slot.*/
SELECT t.id + 3
FROM fab_booking_slots AS t
WHERE t.id = '{fab_booking___book_starttime}'
OR NOT EXISTS (
Select 1
From fab_booking_taken AS p1
Where Date(p1.book_date) = Date('{fab_booking___book_bookingdate}')
And p1.book_end > t.heuredepart_resa
And p1.book_start < t.heurearrivee_resa
)
)
Order By id Asc;
Tenho certeza de que isso é logicamente equivalente e, uma vez expresso em uma forma simplificada como essa, é mais fácil ver como você pode fazer com que também retorne o intervalo de tempo adicional.
Você deve ter uma consulta separada para usar ao preencher os intervalos de tempo para uma nova reserva que não tenha um intervalo de tempo existente. Nesse caso, basta remover a única linha
t.id = '{fab_booking___book_starttime}' OR
.