Provavelmente um exagero para o seu aplicativo - mas:
Uma maneira relativamente simples de melhorar suas pesquisas em detrimento de tornar o processo de 'escrita' mais complicado, seria alterar a tabela de reservas para torná-la uma tabela de 'disponibilidade'.
Adicione uma coluna booleana para indicar se o slot está livre ou reservado (ou melhor ainda, coloque o id do cliente que reservou e use 0 se o slot estiver livre).
Comece com um único slot grátis, 1º de janeiro de 2009 -> 31 de dezembro de 20??
Quando você receber uma reserva, divida o slot gratuito em 3 (duas inserções e uma atualização), o slot reservado e os dois slots disponíveis.
Continue fazendo isso e, à medida que o período de tempo ficar mais fragmentado, o processo de reserva consistirá em um dos seguintes:
- Atribuir um 'espaço disponível' inteiro a alguém (uma atualização)
- Dividir um 'espaço disponível' em dois (uma atualização e uma inserção)
- Dividir um slot em 3 (como acima) se alguém reservar a seção do meio de um slot disponível.
Isso não é incrivelmente complicado de gerenciar e o processo de pesquisa se torna uma consulta simples:encontrar quaisquer slots no período de tempo necessário que estejam disponíveis (reservado=falso ou customerid=0, independentemente do caminho que você escolher) onde enddate - startdate>=o número de dias que você deseja.
Ele dobra o tamanho da tabela de reservas/disponibilidade e torna as reservas menos simples, mas a desvantagem é que o processo de pesquisa é o mais fácil possível.