【发布时间】:2013-08-13 11:19:39
【问题描述】:
我有关于获取数据库表中不存在的日期的查询。
我在数据库中有以下日期。
2013-08-02
2013-08-02
2013-08-02
2013-08-03
2013-08-05
2013-08-08
2013-08-08
2013-08-09
2013-08-10
2013-08-13
2013-08-13
2013-08-13
我想要如下预期的结果,
2013-08-01
2013-08-04
2013-08-06
2013-08-07
2013-08-11
2013-08-12
如您所见,结果中有六个日期不存在于数据库中,
我已尝试以下查询
SELECT
DISTINCT DATE(w1.start_date) + INTERVAL 1 DAY AS missing_date
FROM
working w1
LEFT JOIN
(SELECT DISTINCT start_date FROM working ) w2 ON DATE(w1.start_date) = DATE(w2.start_date) - INTERVAL 1 DAY
WHERE
w1.start_date BETWEEN '2013-08-01' AND '2013-08-13'
AND
w2.start_date IS NULL;
但以上返回以下结果。
2013-08-04
2013-08-14
2013-08-11
2013-08-06
正如你所看到的,它从 14 个日期中返回四个日期是不需要的,但由于左连接,它仍然不包含 3 个日期。
现在请查看我的查询,让我知道我能做到这一点的最佳方法是什么?
感谢您的关注和时间。
【问题讨论】:
-
“如您所见,结果有六个日期不存在于数据库中”。这让我发笑。我看到数百万个日期不在数据中(至少自从人类认识到日期是什么之后)。你怎么知道开始值和结束值是什么?
-
根据关系代数的性质,我认为不可能让数据库推断出未指定数量的缺失数据。您可以做的最好的事情可能是在您的表中已经存在的两个日期之间找到非空日期范围。
-
@GordonLinoff 我想你忘了查看查询...我已经设置了
w1.start_date BETWEEN '2013-08-01' AND '2013-08-13'所以我可以说缺少六个日期... -
您可以考虑根据 all_object 的 rownum 数量列表与 'ddd' 进行比较