2009-11-09 65 views
14

我需要一些關於SQL Query的幫助。SQL查詢不在兩個日期之間

我試圖從表test_table中選擇所有不符合兩個日期'2009-12-15'和'2010-01-02'之間的記錄。

這是我的表結構:

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

我的查詢:

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 

任何想法,爲什麼我的查詢選擇錯誤的記錄?我應該改變在查詢值的順序是這樣的:

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

非常感謝您的幫助

+0

如果你把不在start_date之前它應該工作。 – brandonstrong 2017-01-30 15:43:00

回答

25

如何努力:

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

將返回其完全不重疊的日期範圍內的所有日期範圍。

+2

我會反對這個建議,甚至在中等表格上這會導致查詢變得非常慢。 – Xnoise 2013-03-30 16:25:42

+3

@xnoise - 請問,你的選擇是什麼? – MatBailie 2013-07-16 21:43:04

+2

您能否解釋爲什麼「不在此處」不起作用? – 2015-12-08 04:01:26

2

你的意思是所選行的日期範圍不應該在指定的日期範圍內完全說謊?在這種情況下:

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

(以上語法適用於Oracle,您可能會略有不同)。

0

假設起始日期爲END_DATE之前,

區間[start_date..end_date] NOT BETWEEN兩個日期簡單地意味着,或者它2009-12-15之前開始或2010-01-02後結束。

然後,你可以簡單地做

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

目前你正在做什麼檢查無論是起始日期還是END_DATE秋天給出的日期範圍內是否。

我想你真正想要的是在給定日期範圍內沒有擬合的記錄。如果是這樣,請使用下面的查詢。

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

你的邏輯倒退了。

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

如果有重疊,表的start_date必須小於間隔結束日期(即它必須在間隔結束之前開始),並且表的end_date必須大於間隔開始日期。根據您的需求,您可能需要使用< =和> =。

1

如果'NOT'放在start_date之前,它應該工作。出於某種原因(我不知道爲什麼)在'BETWEEN'之前放入'NOT'時,它似乎會返回所有內容。

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