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

标签 mysql sql stored-procedures gaps-and-islands

假设我有一些记录如下:

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

我如何构造一个将返回 2011-01-03 和 2011-01-05 的查询,即未使用的日期。我将博客日期推迟到 future ,我想要一个查询来显示我还没有发布任何内容的日子。它会从当前日期到 future 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 

我猜想选择数据的缺失是不可能的。

最佳答案

您是对的 — SQL 无法轻松识别丢失的数据。通常的技术是将您的序列(带间隙)与一个完整序列连接起来,并在您的数据中选择后一个序列中没有对应伙伴的那些元素。

所以,@BenHoffstein 的 suggestion维护一个永久的日期表是一个很好的方法。

除此之外,您可以使用 integers table 动态创建该日期范围.假设 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;

关于mysql - 返回表中未使用的所有日期的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4559817/

相关文章:

mysql - 如何获取mysql表的所有行父项

mysql - 带有 Mysql 的 ASP.NET MVC 不会生成 Controller

PHP/MySql 连接开销

mysql - 使用 UNION ALL 选择以将表名显示为附加列

带有 INTO OUTFILE 的 mysql 存储过程

MySQL存储过程如何生成新的auto_increment?

mysql:更新或创建提交日期比数据库更新的条目

mysql - 创建用户到组的映射,并根据用户组合获取组

mysql - 如何更正已删除行的自动增量字段(1,2,3,4,5 - 现在是 1,3,5),但我希望它是 1,2,3

mysql - 即使其中一个表为空,SELECT 也返回行