Колонка created_at имеет тип timestamptz. Как получить дату события в UTC (тип date), чтобы результат не зависел от таймзоны сессии?

Acreated_at::date: приведение к date без явной таймзоны опирается на текущие настройки сессии
B(created_at AT TIME ZONE 'UTC')::date: явный перевод момента в UTC и затем отбрасывание времени до даты
CDATE_TRUNC('day', created_at)::date: округление по таймзоне сессии и приведение timestamptz к типу date
D(created_at AT TIME ZONE 'Europe/Moscow')::date: перевод момента в московское время с приведением к date
Правильный ответ. Приведение timestamptz к date зависит от таймзоны сессии; для UTC сначала используйте AT TIME ZONE 'UTC'.

Разбор

Когда вы делаете created_at::date, PostgreSQL сначала переводит timestamptz в локальное время таймзоны сессии, затем отбрасывает время. Чтобы получить UTC-дату, явно переведите момент времени в UTC: (created_at AT TIME ZONE 'UTC')::date. Вариант с Europe/Moscow даст московскую дату, а DATE_TRUNC без явной таймзоны имеет ту же проблему, что и обычный каст.

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

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