diff --git a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/search/ClickHouseSearchEngine.java b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/search/ClickHouseSearchEngine.java index 81f77d2f..67744177 100644 --- a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/search/ClickHouseSearchEngine.java +++ b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/search/ClickHouseSearchEngine.java @@ -106,12 +106,13 @@ public class ClickHouseSearchEngine implements SearchEngine { long intervalSeconds = Duration.between(from, to).getSeconds() / bucketCount; if (intervalSeconds < 1) intervalSeconds = 1; + // Use epoch-based bucketing for DateTime64 compatibility String sql = "SELECT " + - "toStartOfInterval(start_time, INTERVAL " + intervalSeconds + " SECOND) AS bucket, " + + "toDateTime(intDiv(toUInt32(toDateTime(start_time)), " + intervalSeconds + ") * " + intervalSeconds + ") AS bucket, " + "count() AS total_count, " + "countIf(status = 'FAILED') AS failed_count, " + - "avg(duration_ms) AS avg_duration_ms, " + - "quantile(0.99)(duration_ms) AS p99_duration_ms, " + + "toInt64(avg(duration_ms)) AS avg_duration_ms, " + + "toInt64(quantile(0.99)(duration_ms)) AS p99_duration_ms, " + "countIf(status = 'RUNNING') AS active_count " + "FROM route_executions " + "WHERE start_time >= ? AND start_time <= ? " +