【问题标题】:SELECT MAX BETWEEN 00:01 and 23:59 on set day - SQLSELECT MAX BETWEEN 00:01 and 23:59 on set day - SQL
【发布时间】:2012-11-11 14:35:12
【问题描述】:

我的 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 Any想法将不胜感激。

【问题讨论】:

  • 为什么没有在感兴趣的一天的第一分钟和最后一分钟发生事件?
  • 什么是“第 1 天,偏移 7 天”?你的意思是第 0 天 = 星期日,第 1 天 = 星期一,...;那么您想要 7 天或更早之前的星期一的数据吗?
  • 第一分钟和最后一分钟很重要,我的错误。第 1 天偏移 7 天表示 8 天前,第 6 天偏移 7 天表示 13 天前

标签: php mysql sql


【解决方案1】:
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 上的函数调用。你应该尝试一下。

【讨论】:

    【解决方案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)");
    

    【讨论】:

    • 感谢您的回答,但它仍然没有返回准确的数据,我需要它在设定日期的 00:01 到 23:59 之间返回 max(total_online)。
    • 再次感谢,但它仍然返回不准确的数据,即我从 8 天得到的结果与我从 7 天得到的结果相同。我认为我的代码和您发布的代码都检查了当前时间day 而不是 00:01 和 23:59
    • 您是否有机会给出一个确切的详细示例,以改善答案?
    • 我的回答是从 2012-11-03 00:00 到 2012-11-04 00:00(这些值设置为 set_day_peak(1,7,14))。要将 2012-11-03 00:00 改为 2012-11-03 23:59,您只需像我之前的答案一样下降,例如 timestamp &lt; date(NOW() - INTERVAL $offset DAY)
    • 这恰好在$days 为 1 时有效;当$days 的值大于 1 时,它会产生错误的结果。不过,核心思想是正确的。
    猜你喜欢
    • 2021-06-11
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 2022-01-13
    • 2021-02-08
    • 1970-01-01
    相关资源
    最近更新 更多