Tarifas de reserva de hotéis SQL Problem

Estou tentando obter meu próprio sistema para verificar as tarifas dos quartos depois de ler outras perguntas aqui no StackOverflo

Minha consulta funciona bem e produz um número correto de dias quando não há sobreposição de tarifas nas datas da reserva, mas quando há uma sobreposição, recebo um dia extra na minha segunda linha de resultado

Por exemplo, uma pessoa chega em 14/04/2011 e sai em 16/04/2011 (2 dias). Há uma mudança de taxa de 66 para 70 no dia 15, então ele deve ter 1 dia na taxa 66 e 1 dia na taxa 70.

Tentei sem TIMEDATE - apenas DATE, mas a mesma coisa acontece.

Inqueri

    SELECT rates.rate_id, rate_start_date, rate_end_date, rate_price, 
(DATEDIFF( IF (rate_end_date > '2011-04-16 14:00:00' , '2011-04-16 14:00:00', rate_end_date),
IF ( rate_start_date < '2011-04-14 12:00:00' , '2011-04-14 12:00:00' , rate_start_date )) +1 ) 
AS days FROM rates 
WHERE rate_start_date <= '2011-04-16 14:00:00' AND rate_end_date > '2011-04-14 12:00:00' 
ORDER BY rate_price ASC

rates table

rate_id rate     rate_start_date        rate_end_date
1       70      2011-04-15 00:00:00   2011-05-31 23:59:59
2       80      2011-06-01 00:00:00   2011-06-30 23:59:59
3      100      2011-07-01 00:00:00   2011-08-31 23:59:59
4       80      2011-09-01 00:00:00   2011-09-30 23:59:59
5       70      2011-10-01 00:00:00   2011-10-31 23:59:59
6       45      2011-11-01 00:00:00   2011-12-31 23:59:59
0       66      2011-01-01 00:00:00   2011-04-14 23:59:59

resultad

rate_id  rate_start_date         rate_end_date       rate    days
0       2011-01-01 00:00:00    2011-04-14 23:59:59  66  1
1       2011-04-15 00:00:00    2011-05-31 23:59:59  70  2 <----this should be 1 day

Eu realmente aprecio qualquer ajuda ou uma explicação de por que minha consulta me fornece o dia extra da segunda linha de resultado

Obrigad

questionAnswers(3)

yourAnswerToTheQuestion