Fix PostgreSQL SUBSTRING on timestamp: use CAST AS DATE with native SQL
SUBSTRING does not work on timestamp in PostgreSQL. Use native SQL with CAST(created_at AS DATE) for daily chart aggregation. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -768,25 +768,17 @@ class AdminController extends AbstractController
|
|||||||
->getArrayResult();
|
->getArrayResult();
|
||||||
|
|
||||||
// Daily chart data
|
// Daily chart data
|
||||||
$visitorsPerDay = $em->createQueryBuilder()
|
$conn = $em->getConnection();
|
||||||
->select("SUBSTRING(v.createdAt, 1, 10) AS day, COUNT(v.id) AS cnt")
|
|
||||||
->from(AnalyticsUniqId::class, 'v')
|
|
||||||
->where('v.createdAt >= :since')
|
|
||||||
->setParameter('since', $since)
|
|
||||||
->groupBy('day')
|
|
||||||
->orderBy('day', 'ASC')
|
|
||||||
->getQuery()
|
|
||||||
->getArrayResult();
|
|
||||||
|
|
||||||
$pageviewsPerDay = $em->createQueryBuilder()
|
$visitorsPerDay = $conn->executeQuery(
|
||||||
->select("SUBSTRING(e.createdAt, 1, 10) AS day, COUNT(e.id) AS cnt")
|
'SELECT CAST(created_at AS DATE) AS day, COUNT(*) AS cnt FROM analytics_uniq_id WHERE created_at >= :since GROUP BY day ORDER BY day ASC',
|
||||||
->from(AnalyticsEvent::class, 'e')
|
['since' => $since->format('Y-m-d H:i:s')],
|
||||||
->where('e.createdAt >= :since')
|
)->fetchAllAssociative();
|
||||||
->setParameter('since', $since)
|
|
||||||
->groupBy('day')
|
$pageviewsPerDay = $conn->executeQuery(
|
||||||
->orderBy('day', 'ASC')
|
'SELECT CAST(created_at AS DATE) AS day, COUNT(*) AS cnt FROM analytics_event WHERE created_at >= :since GROUP BY day ORDER BY day ASC',
|
||||||
->getQuery()
|
['since' => $since->format('Y-m-d H:i:s')],
|
||||||
->getArrayResult();
|
)->fetchAllAssociative();
|
||||||
|
|
||||||
// Merge into aligned arrays
|
// Merge into aligned arrays
|
||||||
$allDays = [];
|
$allDays = [];
|
||||||
@@ -794,8 +786,16 @@ class AdminController extends AbstractController
|
|||||||
foreach ($pageviewsPerDay as $r) { $allDays[$r['day']] = true; }
|
foreach ($pageviewsPerDay as $r) { $allDays[$r['day']] = true; }
|
||||||
ksort($allDays);
|
ksort($allDays);
|
||||||
|
|
||||||
$visitorsMap = array_column($visitorsPerDay, 'cnt', 'day');
|
$visitorsMap = [];
|
||||||
$pageviewsMap = array_column($pageviewsPerDay, 'cnt', 'day');
|
foreach ($visitorsPerDay as $r) {
|
||||||
|
$d = $r['day'] instanceof \DateTimeInterface ? $r['day']->format('Y-m-d') : (string) $r['day'];
|
||||||
|
$visitorsMap[$d] = (int) $r['cnt'];
|
||||||
|
}
|
||||||
|
$pageviewsMap = [];
|
||||||
|
foreach ($pageviewsPerDay as $r) {
|
||||||
|
$d = $r['day'] instanceof \DateTimeInterface ? $r['day']->format('Y-m-d') : (string) $r['day'];
|
||||||
|
$pageviewsMap[$d] = (int) $r['cnt'];
|
||||||
|
}
|
||||||
|
|
||||||
$chartLabels = array_keys($allDays);
|
$chartLabels = array_keys($allDays);
|
||||||
$chartVisitors = array_map(fn ($d) => (int) ($visitorsMap[$d] ?? 0), $chartLabels);
|
$chartVisitors = array_map(fn ($d) => (int) ($visitorsMap[$d] ?? 0), $chartLabels);
|
||||||
|
|||||||
Reference in New Issue
Block a user