Pergunta

Eu preciso de alguma ajuda com SQL Query.

Eu estou tentando selecionar todos os registros de test_table mesa que não se encaixam entre duas datas '2009-12-15' e '2010-01-02'.

Esta é a minha estrutura de tabela:

`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'

A minha 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

Qualquer idéia porque minha consulta selecionar registros errados? Devo mudar a ordem dos valores na consulta para algo como:

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

Muito obrigado por qualquer ajuda

Foi útil?

Solução

Que tal experimentar:

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

que irá retornar todos os intervalos de datas que não se sobrepõem o intervalo de datas em tudo.

Outras dicas

A sua lógica é para trá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)

Você quer dizer que o intervalo de datas das linhas selecionadas não devem deitar totalmente dentro do período especificado? Caso em que:

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

(Sintaxe acima é para Oracle, sua pode ser diferente).

O que você está fazendo atualmente é verificar se nem o start_date nem a queda end_date dentro do intervalo das datas indicadas.

Eu acho que o que você está procurando realmente é um registro que não ajuste no intervalo de datas dado. Se assim for, use a consulta abaixo.

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

Se o 'não' é colocado antes do start_date ele deve funcionar. Por alguma razão (eu não sei porque), quando 'não' é colocado antes de 'entre' parece devolver tudo.

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

Assumindo que start_date é antes end_date,

intervalo [start_date..end_date] NÃO entre duas datas simplesmente significa que ou ele começa antes 2009-12-15 ou ele termina depois 2010-01-02.

Em seguida, você pode simplesmente fazer

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

Para que haja uma sobreposição start_date da tabela tem que ser menor que a data final do intervalo (ou seja, ele tem que começar antes do final do intervalo) E end_date da tabela tem que ser maior do que a data de início do intervalo. Você pode precisar usar <= e> = dependendo de suas necessidades.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top