2009-11-09 14 views
14

Necesito ayuda con SQL Query.Consulta SQL NO entre dos fechas

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

Ésta 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

+0

si se pone NO Fecha_inicial antes de que debería funcionar. – brandonstrong

Respuesta

25

¿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.

+2

No recomendaría esto, incluso en tablas medianas esto hará que la consulta se vuelva realmente lenta. – Xnoise

+3

@xnoise - ¿y qué, dígame, es su alternativa? – MatBailie

+2

¿Puede explicar por qué "NO ENTRE" no funciona aquí? –

2

¿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'; 

(La sintaxis anterior es para Oracle, la suya puede diferir ligeramente).

0

Suponiendo que fecha_inicial es antes fecha_final,

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

, entonces puede simplemente hacer

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

Lo que está haciendo actualmente está comprobando si ni el fecha_inicial ni la caída fecha_final dentro del rango de las fechas dadas.

Supongo que lo que realmente está buscando es un registro que no se ajuste en el rango de fechas indicado. Si es así, use 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 
5

Su lógica está 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) 
0

Para que exista una superposición, la fecha de inicio de la tabla debe ser INFERIOR a la fecha de finalización del intervalo (es decir, debe comenzar antes del final del intervalo) Y la fecha final de la tabla debe ser MAYOR que la fecha de inicio del intervalo. Es posible que deba utilizar < = y > = según sus requisitos.

1

Si el 'NO' se coloca antes de la fecha de inicio, debería funcionar. Por alguna razón (no sé por qué) cuando 'NO' se coloca antes 'ENTRE' parece devolver todo.

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