No już wogóle nie działa co napisałeś. Rok zawsze jest w formacie 4-liczbowym.
Aktualnie mam takie coś:
SELECT r.id AS room_id FROM room r LEFT JOIN property p ON r.property_id=p.id LEFT JOIN city c ON p.city_id=c.id LEFT JOIN region re ON p.region_id=re.id LEFT JOIN room_gallery rg ON rg.room_id=r.id LEFT JOIN property_attraction pa ON pa.property_id=p.id LEFT JOIN attraction a ON a.id=pa.attraction_id AND (a.is_active=1 OR a.is_active IS NULL) LEFT JOIN room_price rp ON rp.room_id=r.id LEFT JOIN room_type rt ON rt.room_id=r.id LEFT JOIN type t ON rt.type_id=t.id AND (t.is_active=1 OR t.is_active IS NULL) LEFT JOIN room_reservation rr ON rr.room_id=r.id WHERE '1231542000' BETWEEN UNIX_TIMESTAMP(CONCAT_WS('-', rp.year_from, rp.month_from, rp.day_from)) AND UNIX_TIMESTAMP(CONCAT_WS('-', rp.year_to, rp.month_to, rp.day_to)) AND ('1231542000' < UNIX_TIMESTAMP(rr.reservation_from) OR '1231542000' > UNIX_TIMESTAMP(rr.reservation_to)) AND '1232146800' BETWEEN UNIX_TIMESTAMP(CONCAT_WS('-', rp.year_from, rp.month_from, rp.day_from)) AND UNIX_TIMESTAMP(CONCAT_WS('-', rp.year_to, rp.month_to, rp.day_to)) AND ('1232146800' < UNIX_TIMESTAMP(rr.reservation_from) OR '1232146800' > UNIX_TIMESTAMP(rr.reservation_to)) GROUP BY r.id ORDER BY p.is_promoted DESC LIMIT 0, 51;
Ale podaje mi złe wyniki

Może ktoś wpadnie na jakiś pomysł albo zauważy błąd. Z góry dzięki!
UPDATE:
Właśnie zauważyłem że problem leży w tym że jesli mamy kilka rezerwacji to on sprawdza w petli i bierze pod uwage ostatni przedział. Jak zrobić żeby sprawdził wszystkie przedzialy a jesli tylko raz wystapi wartosc w przedziale to juz nie zwraca nam obiektu (a nie tylko patrzy na ostatni przedzial)?