Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Select Rango de Fechas

Estas en el tema de Select Rango de Fechas en el foro de Bases de Datos General en Foros del Web. Hola, tengo un problema con una consulta. Este es mi problema. Tengo 4 campos tipo "Date" las dos primeras son "Fec_Ini_Cont", "Fec_Fin_Cont" (fecha inicio contrato ...
  #1 (permalink)  
Antiguo 07/06/2008, 17:53
 
Fecha de Ingreso: febrero-2007
Mensajes: 10
Antigüedad: 17 años, 2 meses
Puntos: 0
Select Rango de Fechas

Hola, tengo un problema con una consulta. Este es mi problema.
Tengo 4 campos tipo "Date" las dos primeras son "Fec_Ini_Cont", "Fec_Fin_Cont" (fecha inicio contrato y fecha final), las otras dos "Fec_Ini_Rango", "Fec_Fin_Rango" es el rango de fechas que trabajo el empleado durante el mes o cualquier otro rango (P.ej.15 dias) o, la idea es que mi consulta me debe de mostrar a todos las personas que su fecha de contratro esten dentro del rango de pago.

codigo Fec_Ini_Cont Fec_Fin_Cont
E00001 02/02/2008 30/11/2008
E00002 01/04/2008 15/04/2008
E00003 03/02/2008 30/03/2008
E00004 16/04/2008 30/04/2008

si el rango es del 01/04/2008 hasta 15/04/2008 el resultado seria:
E00001 (15 dias)
E00002 (15 dias)

si el rango es del 16/04/2008 hasta 30/04/2008 el resultado seria:
E00001
E00004

si el rango es del 01/03/2008 hasta 30/03/2008 el resultado seria:
E00001 (30 dias)
E00003 (30 dias)


Todas las ideas son bienvenidas, de ante mano muchas gracias.
me olvidaba la BD es Oracle
  #2 (permalink)  
Antiguo 08/06/2008, 08:27
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
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:33.