SELECT COUNT(*) AS recent
FROM orders
WHERE created_at >= NOW() - INTERVAL '30 days';
Результат:
recent ------ 2451
SELECT id,
paid_at + INTERVAL '1 month' AS expires_at
FROM payments
WHERE status = 'paid'
LIMIT 2;
Результат:
id | expires_at ----+------------------------ 101 | 2026-08-11 09:14:00+03 102 | 2026-08-10 21:03:00+03
SELECT created_at,
created_at + 2 * INTERVAL '1 week' AS plus_2w
FROM events
LIMIT 2;
Результат:
created_at | plus_2w --------------------+-------------------- 2026-07-01 10:00:00 | 2026-07-15 10:00:00 2026-07-02 12:30:00 | 2026-07-16 12:30:00Порешать SQL-задачи в тренажёре →
Спрашивают в задачах с диапазонами дат, сроками действия и когортными окнами; в паре с NOW()/CURRENT_DATE и DATE_TRUNC.
В SQLite нет типа interval — вместо него передают модификаторы в функции date() и datetime(): date(col, '+7 day'), datetime(col, '-1 month', '+3 hours'). Модификаторы можно комбинировать, и месяцы SQLite тоже считает по календарю. Синтаксис INTERVAL '...' там работать не будет.
'30 days' — это всегда ровно 30 суток. '1 month' — календарный месяц переменной длины (28–31 день), и результат зависит от исходной даты. Для точных окон берите дни, для «через месяц по календарю» — месяцы; они могут дать разные даты.
В MySQL без кавычек и с ключевым словом единицы: NOW() - INTERVAL 30 DAY, created_at + INTERVAL 1 MONTH. Есть также функции DATE_ADD(created_at, INTERVAL 1 MONTH) и DATE_SUB(...). Кавычки, как в PostgreSQL (INTERVAL '30 days'), тут не используются.
LAG · date_trunc · EXTRACT · strftime · TO_CHAR · AGE
Открыть SQL-тренажёр (565 задач) →