Ver Mensaje Individual
  #12 (permalink)  
Antiguo 08/08/2008, 01:44
jurena
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Query con resultado en 2 registros

a ver si esto:
Si las tarifas son consecutivas, no se montan una sobre otras y las hay para todo el año, creo que esta consulta te valdrá. Esto es importante, el año tiene que estar cubierto completo y las tarifas no pueden solaparse.
Te saca el número de días afectados por cada tarifa con su valor económico.
He puesto dos fechas de referencia, el 2008-08-25 sería la entrada, y la salida el 2008-10-15. A mí me ha funcionado muy bien. Para la suma total, sólo tendrías que sumar luego con tu programación el resultado de las cantidades devueltas.

Cita:
SELECT '2008-08-25' as entrada, '2008-10-15' as salida, tarifa_desde, tarifa_hasta, tarifa_valor_noche,case when '2008-08-25' <= tarifa_desde AND '2008-10-15' >= tarifa_hasta then DATEDIFF(tarifa_hasta,tarifa_desde)+ 1 when '2008-08-25' <= tarifa_desde AND '2008-10-15' < tarifa_hasta then (DATEDIFF('2008-10-15',tarifa_desde)+1) when '2008-08-25' > tarifa_desde AND '2008-10-15' >= tarifa_hasta then (DATEDIFF(tarifa_hasta,tarifa_desde) - datediff('2008-08-25', tarifa_desde)+1) when '2008-08-25' > tarifa_desde AND '2008-10-15' < tarifa_hasta then (DATEDIFF(tarifa_hasta,tarifa_desde) - DATEDIFF('2008-08-25',tarifa_desde)-datediff(tarifa_hasta,'2008-10-15')+1) end as DIAS, case when '2008-08-25' <= tarifa_desde AND '2008-10-15' >= tarifa_hasta then (DATEDIFF(tarifa_hasta,tarifa_desde)+1) * tarifa_valor_noche when '2008-08-25' <= tarifa_desde AND '2008-10-15' < tarifa_hasta then (DATEDIFF('2008-10-15',tarifa_desde)+1) * tarifa_valor_noche when '2008-08-25' > tarifa_desde AND '2008-10-15' >= tarifa_hasta then (DATEDIFF(tarifa_hasta,tarifa_desde) - datediff('2008-08-25', tarifa_desde)+1) * tarifa_valor_noche when '2008-08-25' > tarifa_desde AND '2008-10-15' < tarifa_hasta then (DATEDIFF(tarifa_hasta,tarifa_desde) - DATEDIFF('2008-08-25',tarifa_desde)-datediff(tarifa_hasta,'2008-10-15')+1)*tarifa_valor_noche end as cantidad
FROM tarifas
WHERE (
'2008-08-25' <= tarifa_desde
AND '2008-10-15' >= tarifa_desde
)
OR (
'2008-08-25' >= tarifa_desde
AND '2008-08-25' <= tarifa_hasta
)

Última edición por jurena; 08/08/2008 a las 03:27