在MySQL中选择缺少的条目

在MySQL中选择缺少的条目,mysql,Mysql,我有一个数据库,其中包含每30分钟(+/-~3秒)保存一次的数据。大约有20000条记录。现在,我想获得没有保存记录的所有日期时间:例如,我不想得到2012-11-22 16:30,因为它存在于数据库中。但是我想把2012-11-22 16:00作为一个,因为数据库不包含带有该日期的条目 请记住,秒数部分可能会有所不同。通常是在一分钟内,但有时可能是2012-05-10 10:00:03左右 如何执行此类查询?如果您能够使用存储过程,则可以使用生成系统中最高和最低日期之间的日期时间范围 如果您不

我有一个数据库,其中包含每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
。您可能必须更改分隔符,请参见这里的示例:嗯,如果存储过程如其他人所建议的那样,需要一张临时的桌子,这样他们就不那么有趣了。