4

所以可以说我有一些看起来像这样的记录:

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 

我想不可能选择没有数据。

4

4 回答 4

4

一种解决方案是创建一个单独的表,其中包含一列来保存从现在到永恒的所有日期(或者当您希望停止写博客时)。例如:

CREATE TABLE Dates (dt DATE);
INSERT INTO Dates VALUES ('2011-01-01');
INSERT INTO Dates VALUES ('2011-01-02');
...etc...
INSERT INTO Dates VALUES ('2099-12-31');

设置此参考表后,您可以简单地进行外部连接以确定未使用的日期,如下所示:

SELECT d.dt 
FROM Dates d LEFT JOIN Blogs b ON d.dt = b.dt 
WHERE b.dt IS NULL

如果您想将搜索限制在未来两周内,您可以将其添加到 WHERE 子句中:

AND d.dt BETWEEN NOW() AND ADDDATE(NOW(), INTERVAL 14 DAY)
于 2010-12-30T03:45:50.480 回答
4

你是对的——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;
于 2012-09-10T15:24:58.230 回答
0

你可能不会喜欢这样:

select '2011-01-03', count(*) from TABLE where postdate='2011-01-03' 
  having count(*)=0 union
select '2011-01-04', count(*) from TABLE where postdate='2011-01-04' 
  having count(*)=0 union
select '2011-01-05', count(*) from TABLE where postdate='2011-01-05' 
  having count(*)=0 union
... repeat for 2 weeks

或者

创建一个包含 2011 年所有日期的表,然后进行左连接,例如

select a.days_2011
from all_days_2011
left join TABLE on a.days_2011=TABLE.postdate
where a.days_2011 between date(now()) and date(date_add(now(), interval 2 week))
and TABLE.postdate is null;
于 2010-12-30T03:44:29.803 回答
0

从 mysql 数据库中提取行的方法是通过SELECT. 因此,您不能选择不存在的行。

我要做的是用所有可能的日期填写我的博客表(一年,然后重复这个过程)

 create table blog (
    thedate date not null,
    thetext text null,
    primary key (thedate));

循环创建 2011 年的所有日期条目(使用程序,例如 $mydate 是您要插入的日期)

  insert IGNORE into blog (thedate,thetext) values ($mydate, null);

(如果日期已经存在,则 IGNORE 关键字不会创建错误(日期是主键))。
然后你正常插入值

  insert into blog (thedate,thetext) values ($mydate, "newtext") 
  on duplicate key update thetext="newtext";

最后选择空条目,你只需要

  select thedate from blog where thetext is null;
于 2010-12-30T03:56:12.337 回答