Ver Mensaje Individual
  #2 (permalink)  
Antiguo 08/06/2008, 08:27
jurena
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Select Rango de Fechas

Una posible lógica sería:
si la fecha Fec_ini_Cont es mayor o igual que la fecha primera del rango y menor o igual que la fecha segunda, resto a la fecha segunda la Fec_ini_Cont, y al resultado de esa resta le resto luego la diferencia entre fecha segunda y Fec_fin_Cont, pero haciendo que esa resta sea cero si Fec_fin_Cont es mayor que la segunda. Y cuando es anterior la fecha Fec_inic_Cont a la fecha primera, y la Fec_fin_Cont es igual o posterior, en ese caso restamos a la fecha segunda la fecha de inicio, pero teniendo en cuenta que si fecha fec_fin_Cont sobrepasa la fecha segunda, sólo se restará desde la fecha segunda. Espero no haberte liado...
De ese modo, creo que podría salir el número de días. No trabajo con Oracle, sino con MySQL, pero las sintaxis no deben variar mucho para unas fecha de referencia 2008/04/01 como fecha primera del rango y 2008/04/15 como segunda.

SELECT Fec_ini_Cont, Fec_fin_Cont, '2008/04/01' as primerarango, '2008/04/15' as segundarango, IF(Fec_ini_Cont >= '2008/04/01' AND Fec_ini_Cont <= '2008/04/15', DATEDIFF('2008/04/15', Fec_ini_Cont) + 1 - (IF (Fec_fin_Cont <= '2008/04/15', DATEDIFF('2008/04/15', Fec_fin_Cont) ,0)), IF (Fec_ini_Cont < '2008/04/01' AND Fec_fin_Cont > '2008/04/01', IF (fec_fin_Cont <= '2008/04/15', DATEDIFF(fec_fin_Cont,'2008/04/01')+ 1, DATEDIFF('2008/04/15', '2008/04/01')+ 1),0)) AS DIAS from nombretutabla

No he comprobado todos los detalles, como cuando hablamos de un rango de un sólo día... Comprueba eso con algunos ejemplos de fecha controlados

y si quieres sacar sólo las fechas que tienen días
SELECT Fec_ini_Cont, Fec_fin_Cont, '2008/04/01' as primerarango, '2008/04/15' as segundarango, IF(Fec_ini_Cont >= '2008/04/01' AND Fec_ini_Cont <= '2008/04/15', DATEDIFF('2008/04/15', Fec_ini_Cont) + 1 - (IF (Fec_fin_Cont <= '2008/04/15', DATEDIFF('2008/04/15', Fec_fin_Cont) ,0)), IF (Fec_ini_Cont < '2008/04/01' AND Fec_fin_Cont > '2008/04/01', IF (fec_fin_Cont <= '2008/04/15', DATEDIFF(fec_fin_Cont,'2008/04/01')+ 1, DATEDIFF('2008/04/15', '2008/04/01')+ 1),0)) AS DIAS from nombretutabla WHERE SELECT Fec_ini_Cont, Fec_fin_Cont, '2008/04/01' as primerarango, '2008/04/15' as segundarango, IF(Fec_ini_Cont >= '2008/04/01' AND Fec_ini_Cont <= '2008/04/15', DATEDIFF('2008/04/15', Fec_ini_Cont) + 1 - (IF (Fec_fin_Cont <= '2008/04/15', DATEDIFF('2008/04/15', Fec_fin_Cont) ,0)), IF (Fec_ini_Cont < '2008/04/01' AND Fec_fin_Cont > '2008/04/01', IF (fec_fin_Cont <= '2008/04/15', DATEDIFF(fec_fin_Cont,'2008/04/01')+ 1, DATEDIFF('2008/04/15', '2008/04/01')+ 1),0)) > 0


Habrá que perfilarla...

Última edición por jurena; 08/06/2008 a las 14:04 Razón: He añadido partes a la consulta