我的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非常感谢任何想法。
答案 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
上使用索引要困难得多,因此效率可能不高。你应该试验一下。