23 Stimmen

SQL-Abfrage NICHT zwischen zwei Daten

Ich brauche Hilfe bei der SQL-Abfrage.

Ich versuche alle Datensätze aus der Tabelle test_table auszuwählen, die nicht zwischen den beiden Daten '2009-12-15' und '2010-01-02' passen.

Das ist meine Tabellenstruktur:

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

-----------------------------
 **Der folgende Datensatz sollte nicht ausgewählt werden:**

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

Meine Abfrage:

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

Irgendwelche Ideen, warum meine Abfrage falsche Datensätze auswählt? Sollte ich die Reihenfolge der Werte in der Abfrage ändern, beispielsweise zu:

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

Vielen Dank für jede Hilfe

0 Stimmen

Wenn Sie NICHT vor start_date setzen, sollte es funktionieren.

31voto

Jim Lynn Punkte 1001

Wie wäre es mit dem Versuch:

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

das alle Datumsbereiche zurückgeben wird, die sich überhaupt nicht mit Ihrem Datumsbereich überschneiden.

18voto

Dereleased Punkte 9671

Ihre Logik ist umgekehrt.

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)

4voto

brandonstrong Punkte 558

Wenn das 'NOT' vor dem start_date gesetzt wird, sollte es funktionieren. Aus irgendeinem Grund (ich weiß nicht warum) wenn 'NOT' vor 'BETWEEN' gesetzt wird, scheint es, alles zurückzugeben.

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

3voto

Tony Andrews Punkte 125904

Meinen Sie damit, dass der Datumsbereich der ausgewählten Zeilen nicht vollständig innerhalb des festgelegten Datumsbereichs liegen sollte? In diesem Fall:

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

(Die obige Syntax gilt für Oracle, Ihre könnte leicht abweichen).

1voto

Johannes Rudolph Punkte 34512

Was du derzeit tust, ist zu überprüfen, ob weder das start_date noch das end_date innerhalb des angegebenen Datumsbereichs liegen.

Ich vermute, dass du eigentlich nach einem Datensatz suchst, der nicht in den angegebenen Datumsbereich passt. Falls dies der Fall ist, verwende die Abfrage unten.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X