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

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

Разбор

Если нужно группировать события по дням в конкретной таймзоне, сначала приведите timestamptz к локальному времени через AT TIME ZONE, а затем бакетируйте DATE_TRUNC('day', ...). Иначе результат может зависеть от настроек таймзоны сессии или останется в UTC.

Проверь себя · 1/3разбор после ответа
Какое утверждение верно про DATE_TRUNC('week', ts) в PostgreSQL (где ts типа timestamp)?
Тренировать SQL в Telegram

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