Tôi phải thừa nhận rằng thật khó khăn khi cố gắng gỡ rối truy vấn đó để hiểu logic đằng sau nó nhưng tôi nghĩ rằng truy vấn sau sẽ trả về kết quả mà bạn cần.
{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;
Tôi khá chắc chắn rằng điều này là tương đương về mặt logic và một khi được thể hiện dưới dạng đơn giản như thế này, bạn sẽ dễ dàng hiểu được cách bạn có thể lấy nó để trả lại khoảng thời gian bổ sung.
Bạn nên có một truy vấn riêng để sử dụng khi điền các khoảng thời gian cho một đặt chỗ mới không có một khoảng thời gian hiện tại, trong trường hợp đó, bạn chỉ có thể xóa một dòng duy nhất t.id = '{fab_booking___book_starttime}' OR
.