2009-11-09 21 views
14

Ho bisogno di aiuto con SQL Query.Query SQL NON tra due date

Sto provando a selezionare tutti i record dalla tabella test_table che non rientrano tra due date "2009-12-15" e "2010-01-02".

Questa è la mia struttura della tabella:

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

La mia domanda:

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 

Qualsiasi idea del perché la mia query di selezione record sbagliate? Devo cambiare l'ordine dei valori nella query per qualcosa di simile:

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

Grazie mille per tutto l'aiuto

+0

Se si inserisce NOT prima di start_date, dovrebbe funzionare. – brandonstrong

risposta

25

ne dite di provare:

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

che restituirà tutti gli intervalli di date che non si sovrappongono l'intervallo di date a tutti.

+2

Vorrei sconsigliarlo, anche nelle tabelle medie questo farà sì che la query diventi molto lenta. – Xnoise

+3

@xnoise - e che cosa, per favore, è la tua alternativa? – MatBailie

+2

Puoi spiegare perché "NOT BETWEEN" non funziona qui? –

2

Vuoi dire che l'intervallo di date delle righe selezionate non dovrebbe trovarsi completamente nell'intervallo di date specificato ? Nel qual caso:

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

(la sintassi sopra è per Oracle, la tua potrebbe differire leggermente).

0

Supponendo che data_inizio è prima data_finale,

intervallo [start_date..end_date] NON tra due date significa semplicemente che o si inizia prima 2009-12-15 o finisce dopo 2010-01-02.

allora si può semplicemente fare

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

quello che si sta facendo è verificare se né lo start_date né la caduta end_date all'interno della gamma delle date indicate.

Immagino che quello che stai davvero cercando sia un record che non corrisponde a nell'intervallo di date indicato. In tal caso, utilizzare la query di seguito.

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

La logica è indietro.

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

Perché ci sia una sovrapposizione, la data di inizio della tabella deve essere INFERIORE alla data di fine dell'intervallo (vale a dire che deve iniziare prima della fine dell'intervallo) E la data di fine della tabella deve essere MAGGIORE alla data di inizio dell'intervallo. Potrebbe essere necessario utilizzare < = e > = in base ai requisiti.

1

Se "NOT" viene inserito prima di start_date, dovrebbe funzionare. Per qualche ragione (non so perché) quando 'NOT' è messo prima di 'BETWEEN' sembra che restituisca tutto.

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