2

我有一个带有几个表的数据库,其中包含以时间戳为键的数据记录(dateGMT)。我正在尝试创建一个函数,该函数返回一个 1 和 0 的数组,其中 0 表示每天数据之间存在 4 小时或更长时间的差距。

由于某种原因,我的功能不起作用,我认为这与搜索我需要用 0 标记的天数有关。任何人都能够看到我可能在哪里犯了我的错误?

另外,由于某种原因,这感觉效率不是很高,也欢迎其他解决原始任务的方法!

提前致谢!

//create array with the dates from start of recordings to now
$period = iterator_to_array(new DatePeriod(new DateTime('2013-06-10'),new DateInterval('P1D'),new DateTime()));
$p2 = array();
$n = 0;
//the actual date is used as key for the number of the date
foreach($period as $p){
  array_push($p2,date('Y-m-d',strtotime($p->format('Y-m-d'))));
  //other way i tried: $p2[$p->format('Y-m-d')]= $n; $n++;
}

function makeArr($table,$p) {
  $con = mysql_connect("127.0.0.1", "user", "pass");
  mysql_select_db("table",$con);

  $ret = array_pad(array(),count($p),0);
  $query = "SELECT dateGMT FROM `$table` ORDER BY `dateGMT` ASC";
  $result = mysql_query($query);

  $d1 = strtotime('2013-06-10');
  $n = 0;
  while ($row = mysql_fetch_assoc($result, MYSQL_ASSOC)){
    $d2 = strtotime(implode("",$row));
    if($d1+14400 > $d2){
      $ret[array_search(date('Y-m-d',$d1),$p)] = 1;
      //part of the other way i tried: $ret[$p[$d1]] = 1; 
    }
    $d1 = $d2;
  }
  return $ret;
}
4

2 回答 2

1

有几种方法可以使用 sql 查询来查找间隙,请查看这篇文章:在 MySQL 中查找时间序列数据间隙的方法?

于 2013-07-18T15:40:00.780 回答
0

一种非常有效的方法是使用游标编写存储过程。我认为这会比其他答案中的子查询更快。此过程创建一个游标并遍历您正在检查的日期时间记录。如果有超过您指定的间隙,它将写入 1,如果没有,则将 0 写入表。

    CREATE PROCEDURE findgaps()
    BEGIN    
    DECLARE done INT DEFAULT FALSE;
    DECLARE a,b DATETIME;
    DECLARE cur CURSOR FOR SELECT dateTimeCol FROM targetTable
                           ORDER BY dateTimeCol ASC;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;     
    OPEN cur;       
    FETCH cur INTO a;       
    read_loop: LOOP
        SET b = a;
        FETCH cur INTO a;   
        IF done THEN
            LEAVE read_loop;
        END IF;     
        IF DATEDIFF(a,b) > 1 THEN
            INSERT INTO tmp_table (date, gap)
            VALUES (DATE(a),1)
            ON DUPLICATE KEY UPDATE gap = 1;
        ELSE
            INSERT IGNORE INTO tmp_table (date, gap)
            VALUES (DATE(a),0);
        END IF;
    END LOOP;           
    CLOSE cur;      
    END;

在这种情况下,假设“tmp_table”存在,并且主键为“date”,它是 DATE var 类型。您可以在过程中轻松地将其定义为 TEMPORARY 表,但我在此示例中省略了它。

我想你想要做的是把它写成一个函数而不是一个过程并返回结果集。

于 2013-07-18T16:44:10.377 回答