我基本上每分钟都将数据记录到 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) 提取分钟值,但是对于如何对整个表进行比较我很迷茫。
任何帮助都是极好的。
谢谢
我基本上每分钟都将数据记录到 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) 提取分钟值,但是对于如何对整个表进行比较我很迷茫。
任何帮助都是极好的。
谢谢
MySQL 没有递归功能,因此您只能使用 NUMBERS 表技巧 -
创建一个只包含递增数字的表 - 使用 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;
使用以下方法填充表:
INSERT INTO NUMBERS
(id)
VALUES
(NULL)
...根据需要获取尽可能多的值。
使用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
根据时间部分向您的数据表 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 函数的更多信息,请参阅文档。