Pregunta

Necesito ayuda con consultas SQL.

Estoy tratando de seleccionar todos los registros de test_table mesa, que no cabrían entre dos fechas '2009-12-15' y '2010-01-02'.

Esta es mi estructura de la tabla:

`start_date` date NOT NULL default '0000-00-00',
`end_date` date NOT NULL default '0000-00-00'

-----------------------------
 **The following record should not be selected:**

`start_date`, `end_date`
'2003-06-04', '2010-01-01'

Mi consulta:

SELECT * 

FROM `test_table` 
WHERE 

CAST('2009-12-15' AS DATE) NOT BETWEEN start_date and end_date 
AND 
CAST('2010-01-02' AS DATE) NOT BETWEEN start_date and end_date

¿Alguna idea de por qué mi consulta de selección registros erróneos? ¿Debo cambiar el orden de los valores en la consulta a algo como:

start_date NOT BETWEEN CAST('2009-12-15' AS DATE) and CAST('2010-01-02' AS DATE)

Muchas gracias por cualquier ayuda

¿Fue útil?

Solución

¿Qué tal intentar:

select * from 'test_table'
where end_date < CAST('2009-12-15' AS DATE)
or start_date > CAST('2010-01-02' AS DATE)

que devolverá todos los rangos de fechas que no se solapan el intervalo de fechas en absoluto.

Otros consejos

Su lógica es al revés.

SELECT 
    *
FROM 
    `test_table`
WHERE
        start_date NOT BETWEEN CAST('2009-12-15' AS DATE) and CAST('2010-01-02' AS DATE)
    AND end_date NOT BETWEEN CAST('2009-12-15' AS DATE) and CAST('2010-01-02' AS DATE)

¿Quiere decir que el intervalo de fechas de las filas seleccionadas no debe estar totalmente dentro del intervalo de fechas especificado? En cuyo caso:

select *
from test_table
where start_date < date '2009-12-15'
or end_date > date '2010-01-02';

(Sintaxis de arriba es para Oracle, el suyo puede diferir ligeramente).

Lo que está haciendo actualmente está comprobando si ni el fecha_inicial ni la caída fecha_final dentro de la gama de la fecha dada.

Creo que lo que realmente está buscando es un disco que no lo hace ajuste en el periodo indicado. Si es así, utilice la consulta a continuación.

SELECT * 
    FROM `test_table` 
    WHERE  CAST('2009-12-15' AS DATE) > start_date  AND  CAST('2010-01-02' AS DATE) < end_date

Si el 'NO' se pone antes de la fecha_inicial debería funcionar. Por alguna razón (no sé por qué) cuando 'NO' se antepone 'entre' que parece volver todo.

NOT (start_date BETWEEN CAST('2009-12-15' AS DATE) AND CAST('2010-01-02' AS DATE))

Si se asume que es fecha_inicial antes fecha_final,

intervalo [start_date..end_date] no está entre dos fechas, simplemente significa que, o bien se inicia antes de que termine 2009-12-15 o después de 2010-01-02.

A continuación, puede hacer

start_date<CAST('2009-12-15' AS DATE) or end_date>CAST('2010-01-02' AS DATE)

Para que haya una superposición fecha_inicial de la mesa tiene que ser menor que la fecha de finalización del intervalo (es decir, tiene que comenzar antes del final del intervalo) Y fecha_final de la mesa tiene que ser mayor que la fecha de inicio del intervalo. Puede que tenga que utilizar <= y> = función de sus necesidades.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top