Tengo un problema que me gustaría obtener las fechas que se registran entre dos fechas (es decir, fechas de inicio y finalización).

Tengo una tabla con los siguientes registros:

Crear tabla t (a int, b date, c date);

insert into t values(1, to_date( '01-jan-2015'), to_date( '15-jan-2015'));
insert into t values(2, to_date( '03-jan-2015'), to_date( '10-jan-2015'));
insert into t values(3, to_date( '12-jan-2015'), to_date( '25-jan-2015'));
insert into t values(4, to_date( '20-jan-2015'), to_date( '01-feb-2015'));
insert into t values(5, to_date( '05-feb-2015'), to_date( '10-feb-2015'));

¿Hay alguna forma de usar una declaración SELECT para determinar las fechas que existen dentro del rango de fechas que se indica en esta tabla?

EJ: el valor entre '01-ene-2015 'to_date '15 -jan-2015' ya está allí. De todos modos, hay nuevamente dos valores registrados en '03 -jan-2015 'y '12 -jan-2015'. (mientras que esos ya se definieron entre ('01 -ene-2015 'to_date '15 -jan-2015')) Entonces, necesito obtener el resultado como "values for start_date "'03-jan-2015' is already logged" sin dar el rango de fechas en la consulta. es decir, debería extraer automáticamente el registro para un valor dado.

Esto supone que cuando los períodos se superponen, eliminará una sobrecarga de valores entre el período.

Espero que esto tenga sentido. Amablemente ayúdame a resolver esto.

Gracias, Shruthi

3
Shruthi 15 feb. 2018 a las 08:36

2 respuestas

La mejor respuesta

Pruebe la consulta siguiente, que enumerará todas las entradas superpuestas.

SELECT  *
FROM    t as t1
WHERE EXISTS (
        SELECT  1
        FROM    t as t2
        WHERE   t1.a != t2.a
            AND t1.b <= t2.c AND t1.c >= t2.b
    )

O prueba esto con una combinación a la izquierda

SELECT  t1.*,t2.a as overlap_id
FROM    t as t1
LEFT JOIN t as t2   ON t1.a > t2.a
            AND t1.b <= t2.c AND t1.c >= t2.b
WHERE   t2.a IS NOT NULL

a   b           c           overlap_id
--------------------------------------
2   2015-01-03  2015-01-10  1         --2 overlapped with 1
3   2015-01-12  2015-01-25  1         --3 overlapped with 1
4   2015-01-20  2015-02-01  3         --4 overlapped with 3
2
Abdul Rasheed 15 feb. 2018 a las 06:47

Prueba esto

select * FROM AnyTable WHERE 
              start_date  <= '03-jan-2015' and end_date  >= '03-jan-2015'
2
Mujtaba Roshan 15 feb. 2018 a las 05:51