2009-11-09 11 views
14

Potrzebuję pomocy z zapytaniem SQL.Kwerenda SQL NIE między dwiema datami

Próbuję wybrać wszystkie zapisy z tabeli test_table, które nie pasowałyby do dwóch dat "2009-12-15" i "2010-01-02".

To moja struktura tabeli:

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

Moje zapytanie:

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 

Każdy pomysł, dlaczego mój kwerendy wybrać błędne zapisy? Należy zmienić kolejność wartości w zapytaniu do czegoś podobnego:

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

dziękuję za wszelką pomoc

+0

Jeśli wstawisz NOT before data_poczta, to powinno działać. – brandonstrong

Odpowiedz

25

Jak o próbie:

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

która zwróci wszystkie zakresy dat, które nie pokrywają zakres dat w ogóle.

+2

Chciałbym poradzić sobie z tym, nawet na średnich stołach spowoduje to, że zapytanie stanie się naprawdę powolne. – Xnoise

+3

@ xnoise - a co, módl się, jest twoją alternatywą? – MatBailie

+2

Czy możesz wyjaśnić, dlaczego "NOT BETWEEN" tutaj nie działa? –

2

Czy oznacza to, że zakres dat wybranych wierszy nie powinna w pełni mieszczą się w podanym zakresie dat ? W takim przypadku:

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

(Składnia powyżej dotyczy Oracle, może się nieznacznie różnić).

0

Zakładając, że START_DATE jest przed datą_końcową,

przedział [start_date..end_date] nie między dwiema datami oznacza po prostu, że albo zacznie przed 2009-12-15 lub kończy się po 2010-01-02.

Następnie można po prostu zrobić

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

Co aktualnie robi jest sprawdzenie, czy ani data_początkowa ani spadek end_date w zakresie dat podanych.

Domyślam się, że to, czego naprawdę szukasz, to rekord, który nie ma wartości dopasowany do w podanym zakresie dat. Jeśli tak, użyj zapytania poniżej.

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

Twoja logika jest cofnięta.

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

Aby wystąpiło nałożenie, data początkowa stołu musi być MNIEJ NIŻ data końca przedziału (tj. Musi się rozpocząć przed końcem przedziału) ORAZ data_końcowa tabeli musi być WIĘKSZA NIŻ data rozpoczęcia przedziału. Może być konieczne użycie < = i > = w zależności od wymagań.

1

Jeśli "NOT" zostanie umieszczone przed datą rozpoczęcia, powinno działać. Z jakiegoś powodu (nie wiem dlaczego), gdy "NIE" jest umieszczane przed "BETWEEN", wydaje się, że wszystko zwraca.

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