0

私のコードイグナイターアプリには次の機能があります

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
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時間に記録されたすべての値の最大値が選択されます。非対称条件('>='と'<')は重要です。

別の定式化は次のようになります。

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。実験する必要があります。

于 2012-11-11T16:17:30.110 に答える
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 に答える