1

私は基本的に毎分SQLデータベースにデータを記録していますが、欠落しているエントリがあるかどうかを確認できるようにしたいです(つまり、1分を超える差異があるかどうかを確認します)。

これを例に取ってください:

5 4 2 1

4と2が存在する行を表示して、間に何かが欠けていることがわかるようにします。実際のデータは以下の形式です。

日付時刻

2010-09-12 10:45:00

2010-09-12 10:44:00

等..

EXTRACT(MINUTE FROM date_time)を使用して分の値を抽出する方法を発見しましたが、テーブル全体を比較する方法についてはかなり迷っています。

どんな助けでも素晴らしいでしょう。

ありがとう

4

1 に答える 1

1

MySQLには再帰機能がないため、NUMBERSテーブルのトリックを使用する必要があります-

  1. 増分数のみを保持するテーブルを作成します-auto_incrementを使用して簡単に実行できます。

    DROP TABLE IF EXISTS `example`.`numbers`;
    CREATE TABLE  `example`.`numbers` (
      `id` int(10) unsigned NOT NULL auto_increment,
       PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
  2. 以下を使用してテーブルにデータを入力します。

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    

    ...必要な数の値に対して。

  3. DATE_ADDを使用して日付のリストを作成し、値に基づいて日数を増やしNUMBERS.idます。「2010-06-06」と「2010-06-14」をそれぞれの開始日と終了日に置き換えます(ただし、同じ形式「YYYY-MM-DD HH:MM:SS」を使用します)-

    SELECT x.*
      FROM (SELECT DATE_ADD('2010-06-06', INTERVAL n.id - 1 MINUTE)
              FROM numbers n
             WHERE DATE_ADD('2010-06-06', INTERVAL n.id -1 MINUTE) <= '2010-06-14' ) x
    
  4. 時間部分に基づいてデータのテーブルに左結合します。

       SELECT x.ts AS timestamp,
              COALESCE(yt.col, 'missing') AS cnt
         FROM (SELECT DATE_FORMAT(DATE_ADD('2010-06-06', INTERVAL n.id - 1 MINUTE), '%Y-%m-%d %k:%i') AS ts
                 FROM numbers n
                WHERE DATE_ADD('2010-06-06', INTERVAL n.id - 1 MINUTE) <= '2010-06-14') x
    LEFT JOIN YOUR_TABLE yt ON DATE_FORMAT(yt.date, '%Y-%m-%d %k:%i') = x.ts
    

DATE_FORMAT関数の詳細については、ドキュメントを参照してください。

于 2010-09-13T03:22:06.590 に答える