在MySQL中选择缺少的条目
我有一个数据库,其中包含每30分钟(+/-~3秒)保存一次的数据。大约有20000条记录。现在,我想获得没有保存记录的所有日期时间:例如,我不想得到2012-11-22 16:30,因为它存在于数据库中。但是我想把2012-11-22 16:00作为一个,因为数据库不包含带有该日期的条目 请记住,秒数部分可能会有所不同。通常是在一分钟内,但有时可能是2012-05-10 10:00:03左右在MySQL中选择缺少的条目,mysql,Mysql,我有一个数据库,其中包含每30分钟(+/-~3秒)保存一次的数据。大约有20000条记录。现在,我想获得没有保存记录的所有日期时间:例如,我不想得到2012-11-22 16:30,因为它存在于数据库中。但是我想把2012-11-22 16:00作为一个,因为数据库不包含带有该日期的条目 请记住,秒数部分可能会有所不同。通常是在一分钟内,但有时可能是2012-05-10 10:00:03左右 如何执行此类查询?如果您能够使用存储过程,则可以使用生成系统中最高和最低日期之间的日期时间范围 如果您不
如何执行此类查询?如果您能够使用存储过程,则可以使用生成系统中最高和最低日期之间的日期时间范围 如果您不能确定时间戳的分钟粒度,那么您可能需要使用秒作为间隔,而不是分钟
此表的左连接应显示未保存数据的日期和时间。如果要查找间隙,更简单的查询是查找下一次时间不在30分6秒内的所有时间 可以在一个查询中对特定的总时间长度执行此操作。从2010年起(大约3.7年的时间),以下将使用65536甚至30分钟的特别表格检查给定范围内的缺失时间:
(必须为时间戳字段编制索引。)我创建了一个表来显示我的存储过程。表创建查询如下所示
CREATE TABLE `testtable1` (
`id` INT(11) NULL DEFAULT NULL,
`timecol` DATETIME NULL DEFAULT NULL
)
表中包含如下所示的数据
CREATE TABLE `testtable1` (
`id` INT(11) NULL DEFAULT NULL,
`timecol` DATETIME NULL DEFAULT NULL
)
为了满足您的需求,我创建了以下存储过程
DELIMITER $$
CREATE PROCEDURE proc1(fromtime DATETIME,totime DATETIME)
BEGIN
DECLARE a INT Default 1;
DECLARE temptime DATETIME;
DECLARE ini,diff,nos int;
DECLARE temp1,temp6 datetime;
drop table if exists mytemptable;
CREATE TEMPORARY TABLE IF NOT EXISTS mytemptable ( `missing_dates` DATETIME NULL DEFAULT NULL);
if(minute(fromtime)>30) then
set diff=60-(minute(fromtime));
else
set diff=30-(minute(fromtime));
end if;
set temptime=ADDTIME(fromtime,concat('00:',diff,':00'));
while((unix_timestamp(totime)-unix_timestamp(temptime))>0) DO
set temp1=SUBTIME(temptime,'00:00:03');
set temp6=ADDTIME(temptime,'00:00:03');
select count(*) into nos from testtable1 where timecol>=temp1 and timecol<=temp6;
if(nos=0) then
insert into mytemptable (missing_dates) values (temptime);
end if;
set temptime=ADDTIME(temptime,'00:30:00');
END WHILE;
select * from mytemptable;
END $$
结果如下所示
CREATE TABLE `testtable1` (
`id` INT(11) NULL DEFAULT NULL,
`timecol` DATETIME NULL DEFAULT NULL
)
@MikkoP-我可以使用存储过程吗?什么意思?这不是一个需要执行的常规任务。@MikkoP-我是说一个存储过程,您将在存储过程中输入'from'和'to'日期,它将返回缺少的项您要检查的时间范围有多长?嗯,它变化很大。。。从几天到几年MSQL不喜欢它:它说第13行的
时间戳附近有语法错误,第14行的declare
,第30行的repeat
,直到第46行的和第49行的END
。您可能必须更改分隔符,请参见这里的示例:嗯,如果存储过程如其他人所建议的那样,需要一张临时的桌子,这样他们就不那么有趣了。