2015-06-23 143 views
1

我有一個SQL query..My問題一個問題的列表之間是我有日期的列表,如:如何選擇日期[不]範圍

  • 2015年6月23日
  • 2015年6月24日
  • 2015年6月25日
  • 2015年6月26日
  • 2015年6月27日
  • 2015年6月28日

在名爲「days」的表中。

我有另一個表「過濾器」,其中包含的範圍在兩列的列表:

 start | end 
     --------+--------- 
    2015-06-24 | 2015-06-24 
    2015-06-26 | 2015-06-27 
     ...  | ... 

我試圖讓,結果是:

  • 2015-06- 23
  • 2015年6月25日
  • 2015年6月28日

即不在這些範圍內的日期。

我嘗試這樣做:

SELECT day.date 
FROM days, filter 
WHERE days.date not between filter.start and filter.end_time 
group by day.date 

我認爲這代碼可能做的伎倆,但它似乎它的工作原理,只有當有一個排的過濾器table..In我的案件的範圍內,人數不詳在開始時。

我還注意到,刪除「group by」子句時,結果是一個重複日期列表,每個日期出現一次,每個過濾器驗證一次。即在這裏:

  • 2X 2015年6月23日
  • 1X 2015年6月24日
  • 2X 2015年6月25日
  • 1X 2015年6月26日
  • 1X 2015-06- 27
  • 2X 2015年6月28日

大江解決方案可能是隻選擇達到最大值出現的行,但也有我的SQL限制..加上我沒有確定這將是最有效的方式。

有人可以幫我這個嗎?

回答

5

使用not exists

SELECT d.date 
FROM days d 
WHERE NOT EXISTS (SELECT 1 
        FROM filter f 
        WHERE d.date BETWEEN f.start and f.end_time 
       ); 

作爲一個好處,你不需要GROUP BYDISTINCT無論是。

+0

非常感謝你,它像一個魅力 – Etienne