6

mysqlクエリについてサポートが必要です。2011年1月1日から2011年4月30日までのデータを含むdbテーブルがあります。各日付のレコードがあるはずです。テーブルから欠落している日付があるかどうかを確認する必要があります。

たとえば、2011年2月2日にデータがないとします。その日付を見つけるにはどうすればよいですか?

reportdatetimeという列に日付が格納されています。日付は、2011-05-10 0:00:00の形式で保存されます。これは、2011年5月5日午前12:00:00です。

助言がありますか?

4

5 に答える 5

11

これは2番目の回答です。個別に投稿します。

SELECT DATE(r1.reportdate) + INTERVAL 1 DAY AS missing_date
FROM Reports r1
LEFT OUTER JOIN Reports r2 ON DATE(r1.reportdate) = DATE(r2.reportdate) - INTERVAL 1 DAY
WHERE r1.reportdate BETWEEN '2011-01-01' AND '2011-04-30' AND r2.reportdate IS NULL;

これは、日付が続く行が存在しないような日付を報告する自己結合です。

これにより、ギャップの最初の日が検出されますが、欠落している日が複数ある場合、ギャップ内のすべての日付が報告されるわけではありません。

于 2011-07-01T18:32:44.310 に答える
8
  1. CREATE TABLE Days (day DATE PRIMARY KEY);

  2. Days探しているすべての日を入力してください。

    mysql> INSERT INTO Days VALUES ('2011-01-01');
    mysql> SET @offset := 1;
    mysql> INSERT INTO Days SELECT day + INTERVAL @offset DAY FROM Days; SET @offset := @offset * 2;
    

    次に、上向き矢印を押して、INSERT を必要な回数だけ繰り返します。毎回行数が 2 倍になるため、7 回の INSERT で 4 か月分の行を取得できます。

  3. 除外結合を実行して、レポート テーブルに一致しない日付を見つけます。

    SELECT d.day FROM Days d 
    LEFT OUTER JOIN Reports r ON d.day = DATE(r.reportdatetime) 
    WHERE d.day BETWEEN '2011-01-01' AND '2011-04-30' 
        AND r.reportdatetime IS NULL;`
    
于 2011-07-01T17:27:44.167 に答える
0

reportdatetime に「2011 年 2 月 2 日」のエントリがあるが、その日付に関連付けられている他のフィールドが以下のテーブル スナップのように存在しない場合

reportdate  col1    col2
5/10/2011   abc xyz
2/2/2011        
1/1/2011    bnv oda

その後、このクエリは正常に機能します

select reportdate from dtdiff where reportdate not in (select df1.reportdate from dtdiff df1, dtdiff df2 where df1.col1 = df2.col1)
于 2011-07-01T17:42:07.843 に答える
0

より複雑な単一のクエリで実行することもできますが、説明のために一時テーブルを使用した疑似コードを示します。

記録があるすべての日付を取得します。

CREATE TEMP TABLE AllUsedDates

SELECT DISTINCT reportdatetime
INTO AllUsedDates;

5 月 1 日を追加して、04-30 を追跡します

INSERT INTO AllUsedData ('2011-05-01')

「翌日」がない場合は、ギャップが見つかりました。

SELECT A.NEXT_DAY
FROM
    (SELECT reportdatetime AS TODAY, DATEADD(reportdatetime, 1) AS NEXT_DAY FROM AllUsed Dates) AS A
WHERE
    (A.NEXT_DATE NOT IN (SELECT reportdatetime FROM AllUsedDates)
    AND
    A.TODAY <> '2011-05-01') --exclude the last day
于 2011-07-01T17:39:54.637 に答える