1

動作中にMySQLデータベースに保存するプログラムをPHPで作成しました。プログラムが機能しているかどうかを示す表は、次のようになります。

Table_name: downtime
Working(int)    Time(datetime)
1               2011-05-06 15:18:55
0               2011-05-06 15:20:21
1               2011-05-06 15:20:24
0               2011-05-06 16:05:13
1               2011-05-06 16:05:15
0               2011-05-06 16:27:59
1               2011-05-06 16:28:01
0               2011-05-06 16:37:35
1               2011-05-06 16:37:37

ここで、日付間の「ダウンタイム」を取得したいと思います。日付1が2011-05-0615:20:24で、日付2が2011-05-06 16:28:15であるとすると、その期間の1と0の差の合計を返すスクリプトが必要です。 。どうすればこれを作ることができますか?

たとえば、日付1が2011-05-06 15:20:22である場合、さらに2秒のダウンタイムがあるかどうかを知ることが重要です。(ほぼ)完璧な解決策を考えるのは難しいです。

4

5 に答える 5

2

このコードは機能するはずです。サンプルデータでテストしました。

// Example data
// Note: assumes $data is sorted by date already
$data = array(
    "2011-05-06 15:18:55"=>1,
    "2011-05-06 15:20:21"=>0,
    "2011-05-06 15:20:24"=>0,
    "2011-05-06 16:05:13"=>0,
    "2011-05-06 16:05:15"=>0,
    "2011-05-06 16:27:59"=>1,
    "2011-05-06 16:28:01"=>0,
    "2011-05-06 16:37:35"=>0,
    "2011-05-06 16:37:37"=>1
    );

$startTime = strtotime("2011-05-06 15:18:55");
$endTime = strtotime("2011-05-06 16:28:01");

$totalUptime = 0;    
$lastUptime = 0;

foreach ($data as $dateString => $isWorking)
{
    $timestamp = strtotime($dateString);

    if ($lastWorking && $lastTimestamp)
    {
        $allowedStart = $lastTimestamp;
        if ($allowedStart<$startTime)
            $allowedStart = $startTime;

        $allowedEnd = $timestamp;
        if ($allowedEnd>$endTime)
            $allowedEnd = $endTime;

        $diff = $allowedEnd-$allowedStart;

        if ($diff>0)
        {
            $totalUptime += $diff;
        }
    }

    if ($timestamp>=$endTime)
    {
        break;
    }

    $lastTimestamp = $timestamp;    
    $lastWorking = $isWorking;
}

print "Total uptime: ".$totalUptime." seconds";

$dataデータベースから独自のレ​​コードを入力する必要があります。

于 2011-05-06T17:34:38.200 に答える
1

strtotime()を使用してタイムスタンプをUNIXエポックに変換するすべての行を調べ、それらの違いを見つけて合計し、合計ダウンタイムを取得します。

于 2011-05-06T16:55:19.283 に答える
1

私が現在使用している解決策は次のとおりです。

    $objects = Get("table","`date` BETWEEN '".$date_start."' AND '".$date_end."'");   

    $prev = new stdClass();
    $prev->new = 1;
    $prev->date = $date_start;

    $next = new stdClass();
    $next->new = 0;
    $next->date = $date_end;
    $objects = array_merge(array($prev),$objects,array($next));

    $uptime = 0;
    $downtime = 0;
    $prevtime = false;
    foreach($objects as $object)
    {
        $newtime = strtotime($object->date);
        if($prevtime && $object->new == 1)
        {
            $downtime += $newtime - $prevtime;
        }
        elseif($prevtime && $object->new == 0)
        {
            $uptime += $newtime - $prevtime;
        }
        $prevtime = $newtime;
    }     

得る(); データベースと通信するための私の関数です。クエリで見つかったオブジェクト(レコード)を返します。このコードをテスト/使用する場合は、次のように置き換えてください。

$objects = array();
$result = mysql_query("SELECT * FROM table WHERE `date` BETWEEN '".$date_start."' AND '".$date_end."'");
while($object = mysql_fetch_object($result))
{
    $objects[] = $object;    
}
于 2011-05-08T00:02:05.457 に答える
0
select timediff(
(
    select `time`
    from downtime
    where working = 1
    and `time` > t1.`time`
    order by `time` asc
    limit 1
),
t1.`time`
)
from downtime t1
where t1.working = 0

これにより、ダウンタイムの期間ごとに1つずつ、複数の行が表示されます。各行には時間差が表示されますが、実際のダウンタイムを見つけるには、これらの行を合計する必要があります。時差でMySQLのsum()関数を使用するとどうなるかわかりませんが、おそらく秒を返すだけです。time開始時刻または終了時刻がダウンタイム期間にあるときに何が起こるかはテストしていませんが、必要に応じてフィールドを制限することができます。

于 2011-05-06T17:23:00.000 に答える
-1

編集:私は質問を誤解しました、この答えを無視してください

答えは、MySQLにそのデータをどのように保存したかによって大きく異なります。ほとんどの場合、次のようなクエリが必要になります。

SELECT COUNT(*) FROM table WHERE working='1' AND DATE>='startDate' AND DATE<='endDate';

これにより、特定の範囲内の「1」の数がわかります。

于 2011-05-06T16:48:52.220 に答える