Tarifas de reserva de hotel Problema SQL

He estado tratando de obtener mi propio sistema para verificar las tarifas de las habitaciones después de leer otras preguntas aquí en StackOverflow.

Mi consulta funciona bien y produce el número correcto de días cuando no hay superposición de tarifas en las fechas de reserva, pero cuando hay una superposición obtengo un día adicional en mi segunda fila de resultados.

Por ejemplo, una persona llega el 14/04/2011 y se va del 16/04/2011 (2 días). Hay un cambio en la tasa de 66 a 70 el día 15, por lo que debería tener 1 día en la tasa de 66 y 1 día en la tasa de 70.

He intentado sin TIMEDATE, solo DATE pero sucede lo mismo.

Consult

    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

Realmente agradecería cualquier ayuda o una explicación de por qué mi consulta me da el día adicional de la segunda fila de resultados.

Gracia

Respuestas a la pregunta(3)

Su respuesta a la pregunta