假设我有一些记录如下:
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/