2012-11-11 27 views
0

我在我的笨应用中的以下功能上定的日子,选择max之间00:01和23:59 - SQL

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) 

是,它与7天的偏移或(8天前)从00:01最大(total_online)返回到23:59第1天。

因为我不是很聪明与SQL尚未唯一的解决方案,我可以管理将使用PHP来设置时间戳,即($day_start and $day_end)然后使用SELECT MAX BETWEEN但我想看看它是否可以用纯SQL完成任何想法将是非常感激。

+0

为什么不在当天的第一个和最后一个分钟内发生事件? –

+0

什么是'第一天7天抵消'?你的意思是第0天=星期天,第1天=星期一,......;所以你需要7天或更多天前的星期一的数据? –

+0

第一个和最后一个分钟确实重要,我的错误。第一天用7天的偏移量表示8天前,第六天用7天的偏移量表示13天前 –

回答

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

,因为它是非常困难的优化器上timestamp使用,因为上timestamp函数调用的一个索引,这可能不是同样有效。你应该试验。

+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)"); 
+0

感谢您的答案,但它仍然没有返回准确的数据,我需要它在设定日期的00:01至23:59之间返回max(total_online)。 –

+0

检查我编辑的答案。 –

+0

再次感谢,但它仍然返回不准确的数据,即即时从8天得到相同的结果,因为我从7岁。我认为我的代码和您发布的代码都检查当天的时间,而不是00:01和23:59 –