Как рассчитать среднее значение между созданным диапазоном? - PullRequest
0 голосов
/ 13 марта 2020

У меня есть программа посещаемости, которая должна отображать среднее время в диапазоне дней в столбце created_at. В настоящее время я сделал это следующим образом:

/**
 * Show the average arrival time from user's attendance
 * records between today and last month.
 *
 * @author Donny Pratama <donnypratama1024@gmail.com>
 * @return \Illuminate\Http\Response
 */
public function showAverageAttendanceTime()
{
    $today = Carbon::now();
    $lastMonth = Carbon::now()->subDays(30);

    $averageArrivalTime = auth()->user()->attendances()
        ->select('created_at')
        ->whereBetween('created_at', [$lastMonth, $today])
        ->avg('created_at');

    return response()->json([
        'success' => true,
        'data' => [
            'average_arrival_time' => Carbon::parse($averageArrivalTime)->toTimeString()
        ]
    ]);
}

Проблема в том, что в некоторых случаях Carbon не может проанализировать строку и выдает эту ошибку:

Исключение: DateTime :: __ construct (): Не удалось проанализировать строку времени (20200311271139.3796) в позиции 12 (3): неожиданный символ в файле / Users / stechoq / Документы / Программы / Laravel / prismahr-backend / vendor / nesbot / carbon / src / Carbon / Черты / Создатель. php на линии 81

Может ли кто-нибудь помочь мне?

РЕДАКТИРОВАТЬ

Я пытаюсь избежать используя необработанные SQL запросы, если это возможно.

1 Ответ

1 голос
/ 13 марта 2020

Просто подумайте, вы можете попробовать что-то вроде этого:

$averageArrivalTime = auth()->user()->attendances()
    ->whereBetween('created_at', [$lastMonth, $today])
    ->avg(DB::raw('FROM_UNIXTIME(created_at)'));

Carbon::createFromTimestamp($averageArrivalTime)->toTimeString();

Относитесь к дате как к числу, чтобы получить точное среднее значение, а затем конвертируйте ее обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...