如何在范围列表之间选择日期[不]

时间:2015-06-23 11:34:32

标签: sql

我的SQL查询有问题。我的问题是我有一个日期列表,例如:

  • 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年6月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

我认为这段代码可能已经完成了这个技巧,但它似乎只有在过滤表中有一行时才有效。在我的情况下,开始时不知道范围的数量。

我还注意到,当删除“group by”子句时,结果是一个重复日期列表,每个日期在每个过滤器验证时出现一次。即这里:

  • 2x 2015-06-23
  • 1x 2015-06-24
  • 2x 2015-06-25
  • 1x 2015-06-26
  • 1x 2015-06-27
  • 2x 2015-06-28

Ohe解决方案可能只选择达到最大值的行,但是有我的sql限制..另外我不确定这是最有效的方法。

有人可以帮我这个吗?

1 个答案:

答案 0 :(得分:7)

使用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