1

我基本上每分钟都将数据记录到 SQL 数据库中,但我希望能够检查是否缺少任何条目(即:查看是否存在大于一分钟的差异)。

以此为例:

5 4 2 1

我想显示存在 4 和 2 的行,以便我知道它们之间缺少一些东西。实际数据格式如下。

约会时间

2010-09-12 10:45:00

2010-09-12 10:44:00

ETC..

我发现了如何使用 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. 根据时间部分向您的数据表 LEFT JOIN:

       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 回答