В таблице users(signup_at) поле signup_at имеет тип date. Нужно получить дату «через один календарный месяц» после регистрации. Какое выражение корректнее?

Asignup_at + INTERVAL '30 days': фиксированный сдвиг на 30 дней в качестве приближения к месяцу
Bsignup_at + INTERVAL '4 weeks': сдвиг на 28 дней через интервал в неделях вместо календарного месяца
Csignup_at + INTERVAL '1 month': календарный сдвиг на месяц с учётом длины конкретного месяца
DDATE_TRUNC('month', signup_at) + INTERVAL '1 month': выражение возвращает первое число следующего месяца
Правильный ответ. Календарные месяцы корректнее считать через INTERVAL '1 month', а не фиксированное число дней или недель.

Разбор

INTERVAL '30 days' и INTERVAL '4 weeks' — это фиксированные числа дней (30 и 28), которые не совпадают с календарным месяцем — он бывает 28, 29, 30 или 31 день. Если бизнес-правило звучит как «через месяц», корректнее использовать + INTERVAL '1 month': Postgres сам учтёт длину месяца. Выражение signup_at + INTERVAL '1 month' возвращает timestamp (обычно с временем 00:00:00); при необходимости приведите результат к ::date. Вариант с DATE_TRUNC('month', signup_at) сначала сдвигает дату к началу месяца и меняет смысл расчёта — это уже первое число следующего месяца, а не «через месяц от регистрации».

Проверь себя · 1/3разбор после ответа
Как получить начало текущей недели (недельный бакет) по текущей дате в PostgreSQL?
Тренировать SQL в Telegram

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