2017-03-14 4 views
0

私は、実行しているサーバーでいくつかの統計情報を収集する5分ごとに実行されるスケジュールされたタスクを持っています。created_atを照会するときに秒を無視する

リクエストが戻ってくるのを待っている間にわずかな遅延があり、2〜3秒後には常にレコードが保存されます。つまり、タスクは2017-14-03 08:00:00で実行されますが、レコードは2017-14-03 08:00:03に保存されます。

グラフを表示するためにレコードを引き出しようとしています。グラフは、(グラフを新しいデータでリフレッシュするハードコードされたボタンを使用して)表示する期間に合わせてスケーリングされます。

私がやろうとしている最初のグラフは、過去24時間のグラフです。最後の24時間に5分ごとにポイントを戻すのではなく、1時間に1つしか必要ありません。私はオフに基づいて、最後の24時間を取得し、最も近い時間に切り捨てとする機能を内蔵している - それは次のようになります、私はwhereIn()などでモデルを照会しようとしています時間が返さ使用

public function last24Hours() 
{ 
    $times = []; 
    $time = Carbon::now()->minute(0)->second(0); 
    $i = 1; 
    while($i <= 24) 
    { 
     array_push($times, $time->toDateTimeString()); 
     $time->subHour(); 
     $i++; 
    } 

    return $times; 
} 

をそう:

$stats = ServerTracking::whereIn('created_at', $this->last24Hours())->get(); 

クエリが実行されますが、何も戻って来ない - created_at時間は数秒オフ私が照会しています何からであるとして。

私はちょっとした打撃を受けましたが、これを回避する方法は考えられませんか?何か案は?

答えて

1

似ていますが、少し短いです。

$stats = ServerTracking::selectRaw('foo,bar,DATE_FORMAT(created_at, "%Y-%m-%d %H:00:00") as hour_created')->get()->keyBy('hour_created'); 

各時間の値のすべての同じhour_createdを持つことになり、そしてkeyByのみ(ドキュメントから)それらのいずれかを保持します:

複数のアイテムが同じキーを持つ場合、最後のアイテムのみが新しいコレクションに表示されます。

fooとbarを必要な値に置き換えてください。クエリを並べ替える方法に応じて、0分55秒の値または0分の値を保持します。

->whereRaw("DATE_FORMAT(created_at, '%Y-%m-%d %H:00:00') in (" .implode(",",$last24Hours). ")") 
+0

美しく動作します。 – James

0

それ自体は解決策ではありませんが、私は別の方法を採用します。私はあなたが最後の24時間(1日間)を照会しようとしている理解と仮定すると、私はwhereBetweenを使用して

$now = Carbon::now(); 
$stats = ServerTracking::where('created_at', '<=', $now) //now 
->where('created_at', '>=', $now->subHours(24)) //24hours ago 
->get(); 

をするだろうあなたがフォーマットされた日付とselectRawを使用することができます

$now = Carbon::now(); 
$stats = ServerTracking::whereBetween('created_at', [$now, $now->subHours(24)]) 
->get(); 
+0

私は上記の私の心を交差させやって、タスクごとに5分を実行するのではなく、24よりも720ポイントを返します:

は、考えてみれば、あなたはそれをあなたの方法を行うためにwhereRaw使用することができます。私はスケーリングのオプションのいくつかがあなたにはるかに詳細に見ることができるように5分ごとにそれを実行します(例えば、最後の時間 - 5分毎のポイントを示す) – James

+0

あなたは正しいです、私はそれを考慮しませんでした。 – EddyTheDove

関連する問題