2017-03-14 5 views
0

5 분마다 실행되는 예약 된 작업이 실행중인 서버에서 일부 통계를 수집합니다.created_at를 쿼리 할 때 초를 무시합니다.

요청이 다시 돌아 오기를 기다리는 동안 약간의 지연이 있으므로 2 ~ 3 초 후에 항상 레코드가 저장됩니다. 작업이 2017-14-03 08:00:00에서 실행되지만 레코드는 2017-14-03 08:00:03에 저장됩니다.

레코드를 그래프에 표시하려고합니다. 그래프는보고자하는 기간으로 확장됩니다 (하드 코드 된 단추를 통해 새 데이터로 그래프를 새로 고침).

내가하려고하는 첫 번째 그래프는 지난 24 시간 동안의 그래프입니다. 지난 24 시간 동안 5 분마다 포인트를 가져 오는 대신, 시간당 하나씩 만 원합니다. 그 기반으로 지난 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

당신은 포맷 된 날짜 selectRaw을 사용할 수 있습니다 이해 가정 :

$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은 (문서에서) 중 하나를 유지합니다 :

,691를

여러 항목의 키가 동일한 경우 마지막 항목 만 새 모음에 나타납니다.

foo와 bar를 필요한 다른 값으로 바꿉니다. 쿼리를 정렬하는 방법에 따라 0:55 분 값 또는 0:00 분 값을 유지합니다.

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

아름답게 작동합니다. – James

0

그 자체가 해결책은 아니지만 다른 접근 방식을 취할 것입니다. 난 당신이, 내가 비슷합니다 whereBetween 사용

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

을 할 것이다 마지막 24시간 (일일)를 조회하려하지만 조금 짧은

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

나는 위 내 마음을 교차하고, 작업을 5 분마다 실행, 오히려 24보다 720 점을 반환 :

이 그것을 생각해 보면, 당신은 그것을 당신의 방법을 수행하는 whereRaw 사용할 수 있습니다. 나는 스케일링 옵션 중 일부가 당신이 훨씬 더 자세하게 볼 수 있도록 매 5 분마다 실행합니다 (예 : 지난 5 시간마다 - 매 5 분 포인트를 보여줍니다). – James

+0

맞습니다. 나는 그것을 고려하지 않았습니다. – EddyTheDove