查询created_at时忽略秒

时间:2017-03-14 04:28:12

标签: php laravel laravel-5.2 php-carbon

我有一个计划任务,每5分钟运行一次,收集我运行的服务器上的一些统计信息。

在等待请求返回时有一个小延迟,因此记录总是在2或3秒后保存。即,任务在2017-14-03 08:00:00运行,但记录保存在2017-14-03 08:00:03

我正在尝试将记录拉出来显示在图表上。图表会缩放到您想要查看的时间段(通过使用新数据刷新图表的硬编码按钮)。

我想要做的第一张图是过去24小时内的图。在过去的24小时里,我每小时只需要一次,而不是每回一次。我已经构建了一个函数来向下舍入到最近的小时,然后根据它来获得最后24小时 - 它看起来像这样:

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;
}

使用返回的时间,我尝试使用whereIn()查询模型,如下所示:

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

查询运行,但没有任何回复 - 因为created_at时间与我查询的内容相距几秒钟。

我遇到了一些障碍,想不出办法解决这个问题?有什么想法吗?

2 个答案:

答案 0 :(得分: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只保留其中一个(来自文档):

  

如果多个项具有相同的键,则只有最后一个项将出现在新集合中。

只需将foo和bar替换为您需要的其他值即可。您将保留0:55分钟值或0:00分钟值,具体取决于您对查询进行排序的方式。

想想看,你可以用whereRaw按照自己的方式去做:

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

答案 1 :(得分:0)

本身不是解决方案,但我会采取不同的方法。假设我理解你正在尝试查询过去24小时(1天),我会做

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

使用whereBetween类似,但更短

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