Znów utknąłem na czymś, co powinno być proste i nie wiem czy nie jest, czy ja zgłupiałem

Opis: Mamy widok tabeli, który pokazuje numery łóżek i daty ich rezerwacji (każde łóżko może mieć nieskończoną ilość rezerwacji na nieskończoną ilość terminów, jedynym ograniczeniem jest to, że każda data może być zarezerwowana TYLKO raz dla każdego łóżka (znaczy mieścić się w przedziale data_od-data_od włącznie). Jeśli rezerwacja jest na 1 dzień to wtedy data_od i data_do są tożsame.
Cel: Jak wyciągnąć listę wolnych łóżek (id) na podstawie daty od i daty do.
Bardzo łatwo jest wyciągnąć dane o zajętych łóżkach na podstawie tych dat... no i teraz od wszystkich łóżek mógłbym odjąć te zajęte, ale może da się to jakoś ugryźć w prostszy sposób. NULL oznacza, że nie było jeszcze nigdy rezerwacji na dane łóżko, co oznacza, że jest wolne dla wszystkich dat.
Tabela rezerwacji:
id | lozka_kod | data_od | data_do 3 | M4L1D |2017-01-01|2016-01-01 3 | M4L1D |2017-05-20|2018-05-22 4 | M4L1G |NULL |NULL 1 | M4P1D |2017-03-01|2017-03-03 1 | M4P1D |2017-03-13|2017-03-13 1 | M4P1D |2017-03-16|2017-03-18 2 | M4P1G |2017-03-14|2017-03-14 5 | M6F1D |NULL |NULL 6 | M6F1G |NULL |NULL
Przykłady:
Dla dat: [2017-01-01 - 2017-01-31] powinno zwrócić: [1,2,4,5,6] (bo 3 jest zarezerwowane 2017-01-01)
Dla dat: [2017-03-02 - 2017-03-02] powinno zwrócić: [2,3,4,5,6] (bo 1 jest zarezerwowane 2017-03-01 - 2017-03-03)
Dla dat: [2017-03-01 - 2017-03-31] powinno zwrócić: [3,4,5,6] (bo 1 i 2 jest zarezerwowane w marcu)
W sumie jestem na samym początku projektowania tego systemu, więc jeśli należy w ogóle podejść do tego od innej strony, to też mogę to rozważyć.
Będę wdzięczny za pomoc...
K.