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

その通りです— SQLでは、欠落しているデータを簡単に特定することはできません。通常の手法は、完全なシーケンスに対して(ギャップを使用して)シーケンスを結合し、データに対応するパートナーがない状態で、後者のシーケンスでそれらの要素を選択することです。

したがって、永続的な日付テーブルを維持するという@BenHoffsteinの提案は良いものです。

それがなければ、整数テーブルを使用してその日付範囲を動的に作成できます。テーブルに少なくとも0〜13の番号integersの列があり、テーブルに次の名前の日付列があると仮定します。idatestamp

   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 に答える
4

解決策の 1 つは、1 つの列を含む別のテーブルを作成して、今から永遠に (またはブログをやめる予定があるときはいつでも) すべての日付を保持することです。例えば:

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

検索を 2 週間先に限定したい場合は、これを WHERE 句に追加できます。

AND d.dt BETWEEN NOW() AND ADDDATE(NOW(), INTERVAL 14 DAY)
于 2010-12-30T03:45:50.480 に答える
0

mysqlデータベースから行を抽出する方法は、を使用することSELECTです。したがって、存在しない行を選択することはできません。

私がすることは、私のブログテーブルにすべての可能な日付を記入することです(1年間、その後プロセスを繰り返します)

 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 に答える
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 に答える