0

30 分 (+/- ~3 秒) ごとに保存されたデータを含むデータベースがあります。約20,000件のレコードがあります。レコードが保存されていないときにすべての日時を取得したい: たとえば、データベースに存在するため、結果として 2012-11-22 16:30 を取得したくありません。しかし、データベースにはその日付のエントリが含まれていないため、2012-11-22 16:00 を取得したいと考えています。

秒の部分は異なる場合があることに注意してください。通常はちょうどその分ですが、2012-05-10 10:00:03 程度になることもあります。

このようなクエリを実行するにはどうすればよいですか?

4

3 に答える 3

0

ストアド プロシージャを表示するテーブルを 1 つ作成しました。テーブル作成クエリを以下に示します

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 $$

必要な結果を取得するには、上記のストアド プロシージャを「時間から」と「時間まで」で呼び出すだけです。例えば

call proc1('2013-01-01 14:00:00','2013-01-01 17:00:00')

結果を以下に示します

ここに画像の説明を入力

于 2013-01-01T15:37:05.217 に答える
0

ストアド プロシージャを使用できる場合は、このストアド プロシージャを使用して、システム内で最も高い日付と最も低い日付の間の日時の範囲を生成できます。

タイムスタンプの分単位の粒度について確信が持てない場合は、分ではなく秒を間隔として使用する必要がある場合があります。

このテーブルに対する左結合は、データが保存されていない日付と時刻を明らかにする必要があります。

于 2013-01-01T10:29:04.627 に答える
0

ギャップを探している場合、より簡単なクエリは、次の後の時間が 30 分 6 秒以内にないすべての時間を検索することです。

特定の合計時間の間、単一のクエリでそれを行うことができます。以下は、2010 年から 65536 偶数 30 分時間 (約 3.7 年時間) のアドホック テーブルを使用して、指定された範囲内の欠落時間をチェックします。

select t
    from (select date_add('2010-01-01', interval (a+4*b+16*c+64*d+256*e+1024*f+4096*g+16384*h)*30 minute) t from (select 0 a union select 1 union select 2 union select 3) a, (select 0 b union select 1 union select 2 union select 3) b, (select 0 c union select 1 union select 2 union select 3) c, (select 0 d union select 1 union select 2 union select 3) d, (select 0 e union select 1 union select 2 union select 3) e, (select 0 f union select 1 union select 2 union select 3) f, (select 0 g union select 1 union select 2 union select 3) g, (select 0 h union select 1 union select 2 union select 3) h order by t) ad_hoc_times
left join ( your_table, (select -3 t_adj union select -2 union select -1 union select 0 union select 1 union select 2 union select 3) t_adj )
    on your_timestamp=date_add(t, interval t_adj second)
where t between '2010-07-01' and '2012-07-01'
    and your_table.your_timestamp is null;

(タイムスタンプ フィールドにインデックスを付ける必要があります。)

于 2013-01-01T12:34:27.877 に答える