一尘不染

SQL查询可返回表中未使用的所有日期

sql

因此,可以说我有一些类似的记录:

2011-01-01 Cat
2011-01-02 Dog
2011-01-04 Horse
2011-01-06 Lion

我该如何构造一个查询,该查询将返回2011-01-03和2011-01-05,即未使用的日期。我将博客发布到未来,我想要一个查询来向我显示我还没有发布任何东西的日子。从当前日期到未来的2周。

更新:

我对建立一个永久性的日期表并不感到兴奋。经过考虑之后,解决方案似乎是制作一个小的存储过程来创建一个临时表。就像是:

CREATE PROCEDURE MISSING_DATES()
BEGIN
    CREATE TABLE TEMPORARY DATES (FUTURE DATETIME NULL)
    INSERT INTO DATES (FUTURE) VALUES (CURDATE())
    INSERT INTO DATES (FUTURE) VALUES (ADDDATE(CURDATE(), INTERVAL 1 DAY))
    ...
    INSERT INTO DATES (FUTURE) VALUES (ADDDATE(CURDATE(), INTERVAL 14 DAY))

    SELECT FUTURE FROM DATES WHERE FUTURE NOT IN (SELECT POSTDATE FROM POSTS)

    DROP TABLE TEMPORARY DATES
END

我猜这是不可能选择 没有 数据的。


阅读 178

收藏
2021-03-10

共1个答案

一尘不染

没错-SQL并不容易识别丢失的数据。通常的技术是将一个序列(有间隔)连接到一个完整序列上,并在后一个序列中选择那些元素,而数据中没有相应的伙伴。

因此,@BenHoffstein提出的维护永久日期表的建议是一个很好的建议。

简而言之,您可以使用整数表动态创建该日期范围。假设该integers表的列i号至少为0到13,并且您的表的日期列名为datestamp

   SELECT candidate_date AS missing
     FROM (SELECT CURRENT_DATE + INTERVAL i DAY AS candidate_date
             FROM integers
            WHERE i < 14) AS next_two_weeks
LEFT JOIN my_table ON candidate_date = datestamp
    WHERE datestamp is NULL;
2021-03-10