Колонка created_at имеет тип timestamptz. Таймзона сессии может отличаться между задачами. Как гарантированно сгруппировать события по UTC-дням?

ADATE_TRUNC('day', created_at): результат опирается на таймзону текущей сессии и в общем случае не даёт стабильных UTC-дней
BDATE_TRUNC('day', created_at::timestamp): приведение к timestamp молча использует таймзону сессии при отбрасывании пояса
CDATE_TRUNC('day', created_at AT TIME ZONE 'Europe/Moscow'): бакеты строятся по московским календарным дням
DDATE_TRUNC('day', created_at AT TIME ZONE 'UTC'): явный перевод момента в UTC даёт стабильные дни независимо от сессии
Правильный ответ. Для стабильных UTC-бакетов на timestamptz явно переводите время в UTC перед DATE_TRUNC.

Разбор

Операции над timestamptz зависят от текущей таймзоны сессии: DATE_TRUNC без явного приведения может в разных запусках попадать на разные сутки. Если отчёт должен считать дни строго по UTC, сначала приведите момент к UTC через created_at AT TIME ZONE 'UTC', а затем применяйте DATE_TRUNC('day', ...). Приведение к timestamp без таймзоны не решает задачу: оно опирается на ту же сессионную таймзону. Перевод в Europe/Moscow даст бакеты по московским дням, а не по UTC.

Проверь себя · 1/3разбор после ответа
Для сравнения метрик по неделям нужно получить начало предыдущей недели. Какое выражение вернёт начало предыдущей недели относительно current_date?
Тренировать SQL в Telegram

Ещё вопросы по теме «Даты и время»