2016-05-10 6 views
0

1分に1回、つまりハートビートに「チェックイン」するデバイスが多数あります。次のようにこれらのハートビートは、MySQLのテーブルに格納されている:タイムスタンプ場合はPHPとJavaScriptのハートビートリストから稼働時間グラフを作成する

+----+-----------+---------------------+ 
| id | entity_id |  heartbeat  | 
+----+-----------+---------------------+ 
| 1 | xyz  | 2016-01-01 01:02:03 | 
+----+-----------+---------------------+ 

「ID」カラムは自動インクリメント整数、「ENTITY_ID」基本的にデバイスを識別し、「ハートビート」の列でありますデバイスはチェックインされました。

ここで、JavaScript(特にChart.js)を使用して、先週のデバイスが稼動していた(つまりハートビートを送信している)回数を示す素晴らしい稼働時間チャートを作成したいと考えています。

私が持っている問題は、明らかにデバイスがチェックインするときにタイムスタンプしか保存しないということです。つまり、30分間チェックインしないと、2つのタイムスタンプの間に30分のギャップがあります。do持ってる。

私はサーバー側でPHPを使用しています。このタイムスタンプのリストを使用して、おそらくタイムスタンプがあるかどうかを毎分表示するJSONオブジェクトを作成する簡単な方法はありますか?これをChart.jsに送り、データを棒グラフとして表示することができます。

この表には何十万行もあることを覚えておいて、データを取得するために比較的速く作成しようとしています。

+0

あなたが話しているデバイスの種類? – heximal

+0

私が正しく理解している場合は、0または1のようなデータポイントを1週間に1つのデバイスごとに1分ごとに持たせたいですか?これは、1デバイスあたり10kデータポイントのJSONを意味します。個々のデータ点で考え直すべきですが、むしろそれらを稼働時間とダウンタイムのセグメントにグループ化する必要があります。 – apriede

+0

@heximal彼らは毎分チェックして、彼らがオンラインになっているかどうかを知ることができるようになっています。 –

答えて

0

MySQLの場合はGrouping into interval of 5 minutes within a time rangeのようなクエリを使用してしまいました。その後、JavaScriptでは、過去の時間を取得するためにMoment.jsを使用し、5分を追加してループし、一致するレコードがデータベースから見つかるかどうかを確認するループを作成しました。

SQL:

select unix_timestamp(date_format(`heartbeat`, \'%Y-%m-%d %H:%i\')) as `timestamp`, 
count(`heartbeat`) as `num_heartbeats` from `table` 
where `entity_id` = ? and `heartbeat` >= <date one week ago> 
group by unix_timestamp(`heartbeat`) div 300, `entity_id` 
order by `id` asc 

のJavaScript(jQueryの):

$.get('/ajax/site/uptime', { entity_id: entity_id }) 
.done(function(data) { 
    var heartbeats = []; 

    // Get the time now and 7 days ago 
    var date = moment().subtract(7, 'days').startOf('hour'); 
    var now = moment(); 

    // Find the number of heartbeats per five minutes and add to the array 
    do 
    { 
     if (data[date.format('X')] !== undefined) 
     { 
      heartbeats.push(1); 
     } 
     else 
     { 
      heartbeats.push(0); 
     } 

     date.add(5, 'minutes'); 
    } 
    while (date.format('X') <= now.format('X')); 
}); 
関連する問題