2015-06-23 142 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