0

我的 codeigniter 应用程序中有以下功能

function set_day_peak($days, $offset, $network_id){

    $days = $days + $offset;
    $query = $this->db->query("SELECT MAX(total_online)AS total FROM network_traffic
    WHERE network_id = '$network_id' AND timestamp >= NOW() - INTERVAL $days DAY 
    AND timestamp <= NOW() - INTERVAL $offset DAY");
    $data = $query->row();

    return $data->total;

}   

上面的函数确实返回一个值,但它不准确,我调用时需要什么

$this->set_day_peak(1,7,14)

是让它在第 1 天从 00:01 到 23:59 返回 max(total_online),偏移 7 天或(8 天前)。

由于我对 sql 并不出色,但我可以管理的唯一解决方案是使用 php 来设置时间戳,即($day_start and $day_end)然后使用SELECT MAX BETWEEN,但我想看看它是否可以用纯 SQL 完成。任何想法将不胜感激。

4

2 回答 2

2

我想你想放弃时间部分,所以你可以使用日期功能来减少时间。

$query = $this->db->query("SELECT MAX(total_online)AS total FROM network_traffic
WHERE network_id = '$network_id' AND timestamp >= date(NOW() - INTERVAL $days DAY) 
AND timestamp <= date(NOW() - INTERVAL $offset DAY)");
于 2012-11-11T14:38:04.977 回答
2
function set_day_peak($days, $offset, $network_id){

    $days = $days + $offset;
    $next = $days - 1;
    $query = $this->db->query("
       SELECT MAX(total_online) AS total
         FROM network_traffic
        WHERE network_id = '$network_id'
          AND timestamp >= DATE(NOW() - INTERVAL $days DAY) 
          AND timestamp <  DATE(NOW() - INTERVAL $next DAY)");
    $data = $query->row();

    return $data->total;
}

这种格式(无论是否合法)使 SQL 结构清晰。DATE 函数截断其参数表达式的时间值部分。与时间戳的比较为时间分量“加零”。这应该选择给定 24 小时期间记录的所有值的最大值。不对称条件('>=' vs '<')很重要。

另一种表述是:

function set_day_peak($days, $offset, $network_id){

    $days = $days + $offset;
    $query = $this->db->query("
       SELECT MAX(total_online) AS total
         FROM network_traffic
        WHERE network_id = '$network_id'
          AND DATE(timestamp) = DATE(NOW() - INTERVAL $days DAY)");
    $data = $query->row();

    return $data->total;
}

这可能效率不高,因为优化器使用索引 on 更加困难,timestamp因为函数调用 on timestamp。你应该试验一下。

于 2012-11-11T16:17:30.110 回答