diff --git a/extensions/Servers/Proxmox/Livewire/Statistics.php b/extensions/Servers/Proxmox/Livewire/Statistics.php index 4418e9723..4aa4b5b2a 100644 --- a/extensions/Servers/Proxmox/Livewire/Statistics.php +++ b/extensions/Servers/Proxmox/Livewire/Statistics.php @@ -1429,10 +1429,10 @@ class Statistics extends Component } if ($targetTime) { - // Find the statistic closest to the target time (within 30 minutes) - // Use database-agnostic approach - $minTime = $targetTime->copy()->subMinutes(30); - $maxTime = $targetTime->copy()->addMinutes(30); + // Find the statistic closest to the target time (within 90 minutes) + // Using 90 minutes to ensure we catch hourly statistics even with timing variations + $minTime = $targetTime->copy()->subMinutes(90); + $maxTime = $targetTime->copy()->addMinutes(90); $stats = ServerStatistics::where('server_id', $this->server->id) ->whereBetween('DateTime', [$minTime, $maxTime]) @@ -1440,7 +1440,29 @@ class Statistics extends Component ->get(); if ($stats->isEmpty()) { - return null; + // Fallback: get the closest stat before or after target time + $closestBefore = ServerStatistics::where('server_id', $this->server->id) + ->where('DateTime', '<=', $targetTime) + ->orderBy('DateTime', 'desc') + ->first(); + + $closestAfter = ServerStatistics::where('server_id', $this->server->id) + ->where('DateTime', '>=', $targetTime) + ->orderBy('DateTime', 'asc') + ->first(); + + if (!$closestBefore && !$closestAfter) { + return null; + } + + if (!$closestBefore) return $closestAfter; + if (!$closestAfter) return $closestBefore; + + // Return whichever is closer + $diffBefore = abs($closestBefore->DateTime->diffInSeconds($targetTime)); + $diffAfter = abs($closestAfter->DateTime->diffInSeconds($targetTime)); + + return $diffBefore <= $diffAfter ? $closestBefore : $closestAfter; } // Find the closest one to target time (database-agnostic)