SQL consulta não entre duas datas
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
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.