Tarifas de reserva de hotel SQL Problem

Hola, he estado tratando de get mi propio sistema para verificar tarifas de 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 superposition de tasas en las dates de reserva, pero cuando hay superposition, obtengo un día adicional en mi segunda fila de resultados.

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

Lo intenté sin TIMEDATE, solo DATE, pero sucede lo mismo.

Consulta

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 

tabla de tarifas

 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 

resultado

 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 extra de la segunda fila de resultados.

Gracias

Entre 2011-04-16 16:00 y 2011-04-15 00:00 hay un día y 16 horas, por lo tanto su DATEDIFF(...)+1 regresa (correctamente) 1 + 1 días.

El problema aquí es la falta de coincidencia entre el momento en que el huésped llega / se va (alnetworkingedor del mediodía) y el momento en que la tasa cambia (a medianoche).

Debe verificar sus requisitos, pero probablemente podría ignorar el último día parcial y hacer que el invitado se "retire" el 2011-04-15 23:59:59 para calcular la tarifa. De la misma manera, haga que el invitado "llegue" al 2011-04-14 00:00:00. Las horas adicionales en el primer día compensarán las horas perdidas en el último día.

Si entiendo su algorithm correctamente, quiere include el primer día, incluso parcialmente, por lo que le sugiero que use en lugar de + 1 para cada tasa, haga esto solo para el primero.

Intenta usar esto (MSSQL):

 + CASE WHEN rate_start_date <= '2011-04-14 12:00:00' THEN 1 ELSE 0 end 

o (MYSQL):

 + IF (rate_start_date <= '2011-04-14 12:00:00', 1 ,0) 

Gracias por sus respuestas, Martin produjo 2 filas pero no días … Emilio su respuesta me hizo pensar en cómo había establecido las tarifas. Cambié el formatting de la tabla de tarifas a la date en lugar de la date y realicé el rate_end_date el mismo día que la próxima rate_start_date.

 0 66 2011-01-01 2011-04-15 1 70 2011-04-15 2011-06-01 2 80 2011-06-01 2011-07-01 3 100 2011-07-01 2011-09-01 4 80 2011-09-01 2011-10-01 5 70 2011-10-01 2011-11-01 6 45 2011-11-01 2012-01-01 

luego soltó el +1 y

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

producido

 rate_id rate_start_date rate_end_date rate days 0 2011-01-01 2011-04-15 66 1 1 2011-04-15 2011-06-01 70 1 

y una consulta sin tasas de superposition del 1 al 8 de abril:

 SELECT rates.rate_id, rate_start_date, rate_end_date, rate_price, (DATEDIFF( IF (rate_end_date > '2011-04-08' , '2011-04-08', rate_end_date), IF ( rate_start_date < '2011-04-01' , '2011-04-01' , rate_start_date )) ) AS days FROM rates WHERE rate_start_date <= '2011-04-08' AND rate_end_date > '2011-04-01' ORDER BY rate_price ASC 

produce:

 rate_id rate_start_date rate_end_date rate days 0 2011-01-01 2011-04-15 66 7 

gracias agiain por tu ayuda!