我有一个计划任务,每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
时间与我查询的内容相距几秒钟。
我遇到了一些障碍,想不出办法解决这个问题?有什么想法吗?
答案 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();