我的SQL查询有问题。我的问题是我有一个日期列表,例如:
在名为“days”的表格中。
我有另一个表“过滤器”,其中包含两列范围列表:
start | end
--------+---------
2015-06-24 | 2015-06-24
2015-06-26 | 2015-06-27
... | ...
我想要得到的结果是:
即不在这些范围内的日期。
我试过了:
SELECT day.date
FROM days, filter
WHERE days.date not between filter.start and filter.end_time
group by day.date
我认为这段代码可能已经完成了这个技巧,但它似乎只有在过滤表中有一行时才有效。在我的情况下,开始时不知道范围的数量。
我还注意到,当删除“group by”子句时,结果是一个重复日期列表,每个日期在每个过滤器验证时出现一次。即这里:
Ohe解决方案可能只选择达到最大值的行,但是有我的sql限制..另外我不确定这是最有效的方法。
有人可以帮我这个吗?
答案 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 BY
或DISTINCT
。