Muszę przyznać, że próba rozwikłania tego zapytania, aby zrozumieć logikę za nim stojącą, jest zniechęcająca, ale myślę, że następne zapytanie powinno zwrócić wyniki, których potrzebujesz.
{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;
Jestem prawie pewien, że jest to logicznie równoważne, a po wyrażeniu w tak uproszczonej formie łatwiej jest zobaczyć, jak można to uzyskać, aby zwrócić również dodatkowy przedział czasowy.
Powinieneś mieć oddzielne zapytanie do użycia podczas wypełniania przedziałów czasowych dla nowej rezerwacji, która nie ma istniejącego przedziału czasowego, w takim przypadku możesz po prostu usunąć pojedynczy wiersz t.id = '{fab_booking___book_starttime}' OR
.