如何有效地过滤datetime列以提取数据?

时间:2011-09-27 11:44:45

标签: php sql

我使用sqlite将数据每5分钟记录到一个带时间戳的列和Unix时间的整数。用户界面使用php代码在各种用户可选择的时间帧中提取数据,然后使用javascript绘制。图表通常有12个数据/时间点,我需要提取数据,用于绘制不同时期的数据,例如1Hr / 12Hr / 24Hr / 12days / month / year。因此每次搜索只需要提取12个数据行。因此,对于24小时图,我需要仅以间隔(当分钟= 0)提取数据,类似于每日间隔的12天图(当分钟= 0&小时= 0时)等。

我的1Hr的PHP代码工作正常,因为每5分钟记录一次数据,在搜索开始时间和结束时间之间给出了12行数据。当开始时间和结束时间之间的行数大于12时,在较长时间段内提取数据的有效方法是什么?我需要进一步过滤搜索以有效地仅提取我需要的数据吗?

任何建议 - 最感谢 - 坦诚

$db = new MyDB();                                    // open database
$t=time(); // get current time
$q1 = "SELECT TimeStamp,myData FROM mdata WHERE ";
$q2 = " AND TimeStamp <=".$t;                        // end time
$q3 = " AND TimeStamp >=".($t-3600);                 // start time 1 hour earlier

$qer = $q1.$q2.$q3; // my search query form above parts

$result = $db->query($qer);
$json = array();
while ($data = $result->fetchArray(SQLITE_NUM)) {
$json[] = $data;
}

echo json_encode($json);             // data is returned as json array


$db->close();           // close database connection

2 个答案:

答案 0 :(得分:0)

我认为您应该在搜索查询中使用WHERE日期BETWEEN? 一旦数据建立,这种搜索会占用大量时间吗?

答案 1 :(得分:0)

由于您已经知道您感兴趣的确切时间,因此您应该只构建一个数组并使用SQL's IN operator

$db = new MyDB();                                    // open database
$timeStep = 300;  // Time step to use, 5 minutes here - this would be 3600 for hourly data
$t = time(); // get current time
$t -= $t % $timeStep;  //  round to the proper interval

$query  = "SELECT TimeStamp,myData FROM mdata ";
$query .= "WHERE TimeStamp IN "
$query .= "(" . implode(",", range($t, $t + $timeStep * 12, $timeStep)) . ")";    

$result = $db->query($query);
$json = array();
while ($data = $result->fetchArray(SQLITE_NUM)) {
    $json[] = $data;
}

您需要对月度数据进行一些不同的数学运算 - 尝试使用PHP的mktime()函数构建12次。

以下是我使用的PHP implode()range()函数的参考资料。