在设定日期间选择最长时间00:01和23:59 - SQL

时间:2012-11-11 14:35:12

标签: php mysql sql

我的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非常感谢任何想法。

2 个答案:

答案 0 :(得分: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)");

答案 1 :(得分: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小时内记录的所有值的最大值。不对称条件('&gt; ='vs'&lt;')很重要。

另一种表述是:

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;
}

由于timestamp上的函数调用,优化器在timestamp上使用索引要困难得多,因此效率可能不高。你应该试验一下。