A room is unavailable if any of the reservations already assigned overlap the requested reservation. In other words, if the room is booked from book_start to book_end and the request is from request_start to request_end then
book_start<=request_end and request_start<=book_end
The opposite of this (a booking that does not clash with a reservation) is of course
book_start>request_end or request_start>book_end
Assuming you never overbook in the first place, I think:
"SELECT count(*) from reservations where hotel_id=[the hotel in question] and room_type=[the requested room type] and indate<=[request_end] and [request_start]<=outdate"
will tell you how many rooms are already booked at some time during the requested dates. If this is equal to the number of rooms of that type in the hotel, then the booking can't be made.
Actually, rereading that I realise it's not true: Consider the situation:
A room is booked in July from the 1st to the 4th, and again from the 7th to the 10th. This would be counted as two clashes if the request is from the 3rd to the 9th. If there was only one room vacant over that period, the above count would claim that the hotel was booked out.
To fix this, what you'll need to do is list actual rooms in the reservations table as well as hotels. An extra advantage is that you could get the actual rooms that are available, instead of just a count.