В таблице events(user_id, created_at) колонка created_at типа timestamptz (события записаны в UTC). Нужно посчитать DAU по дням в часовом поясе Москвы и не зависеть от часового пояса сессии. Какой бакет правильный?

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

Разбор

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

Проверь себя · 1/3разбор после ответа
В таблице events(user_id, created_at) поле created_at имеет тип отметки времени с долями секунд. Как корректно посчитать количество событий по дням?
Тренировать SQL в Telegram

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