From 1dd41ef5d0db619efdc3ce75f119d5217c1f48b1 Mon Sep 17 00:00:00 2001 From: Noah Moss <32746338+noahmoss@users.noreply.github.com> Date: Mon, 30 Sep 2024 16:52:16 -0400 Subject: [PATCH] Fix timezone comparisons in failing execution stats test (#48204) --- src/metabase/analytics/stats.clj | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/metabase/analytics/stats.clj b/src/metabase/analytics/stats.clj index 257d7f47a10..c058016f5e0 100644 --- a/src/metabase/analytics/stats.clj +++ b/src/metabase/analytics/stats.clj @@ -354,16 +354,25 @@ ;;; Execution Metrics (defn- execution-metrics-sql [] + ;; Postgres automatically adjusts for daylight saving time when performing time calculations on TIMESTAMP WITH TIME + ;; ZONE. This can cause discrepancies when subtracting 30 days if the calculation crosses a DST boundary (e.g., in the + ;; Pacific/Auckland timezone). To avoid this, we ensure all date computations are done in UTC on Postgres to prevent + ;; any time shifts due to DST. See PR #48204 (let [thirty-days-ago (case (db/db-type) - :postgres "CURRENT_TIMESTAMP - INTERVAL '30 days'" + :postgres "CURRENT_TIMESTAMP AT TIME ZONE 'UTC' - INTERVAL '30 days'" :h2 "DATEADD('DAY', -30, CURRENT_TIMESTAMP)" - :mysql "CURRENT_TIMESTAMP - INTERVAL 30 DAY")] + :mysql "CURRENT_TIMESTAMP - INTERVAL 30 DAY") + started-at (case (db/db-type) + :postgres "started_at AT TIME ZONE 'UTC'" + :h2 "started_at" + :mysql "started_at") + timestamp-where (str started-at " > " thirty-days-ago)] (str/join "\n" ["WITH user_executions AS (" " SELECT executor_id, COUNT(*) AS num_executions" " FROM query_execution" - " WHERE started_at > " thirty-days-ago + " WHERE " timestamp-where " GROUP BY executor_id" ")," "query_stats_1 AS (" @@ -380,7 +389,7 @@ " COALESCE(SUM(CASE WHEN running_time >= 1000000 AND running_time < 10000000 THEN 1 ELSE 0 END), 0) AS num_by_latency__1001_10000," " COALESCE(SUM(CASE WHEN running_time >= 10000000 THEN 1 ELSE 0 END), 0) AS num_by_latency__10000_plus" " FROM query_execution" - " WHERE started_at > " thirty-days-ago + " WHERE " timestamp-where ")," "query_stats_2 AS (" " SELECT" -- GitLab