【问题标题】:How to calculate the average created_at between range?如何计算范围之间的平均created_at?
【发布时间】:2020-06-25 19:16:24
【问题描述】:

我有一个考勤计划,必须在 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():无法在位置 12 (3) 解析时间字符串 (20200311271139.3796):文件 /Users/stechoq/Documents/Programs/Laravel/prismahr-backend/vendor/nesbot/ 中的意外字符carbon/src/Carbon/Traits/Creator.php 在第 81 行

有人可以帮帮我吗?

编辑

如果可能,我会尽量避免使用原始 SQL 查询。

【问题讨论】:

  • dd($averageArrivalTime); 告诉你什么?
  • 它显示了这个字符串"20200311271139.3796"
  • 嗯,可能是因为avg 不知道将日期视为日期。
  • 是的,我想是的。我已经上网一段时间了,但无法获得有关远程时间计算的任何信息。有一堆但只接受 2 个参数,在这种情况下,我需要计算所有参数。

标签: laravel


【解决方案1】:

只是一个想法,你可以试试这样的:

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

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

将日期视为一个数字以获得准确的平均值,然后将其转换回来。

【讨论】:

  • 啊,太美了……而且它有效。非常感谢.. :D
  • 嗨@miken32 ..我刚刚意识到使用上述方法不是计算平均时间。相反,它被当前时间更新。我的意思是,在实施开始时,它显示的是凌晨 2 点(我的当地时间)。现在是凌晨 5 点:/
  • 你能再帮我一次吗?我真的不知道这个:/
  • 我不确定。也许发布一个带有示例输入和预期输出的新问题。
猜你喜欢
  • 2018-12-07
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 2018-02-28
  • 2021-06-17
  • 1970-01-01
  • 2019-11-09
  • 2021-08-21
相关资源
最近更新 更多