INTERVAL в SQL — прибавление и вычитание дат и времени

INTERVAL — это тип-длительность, который прибавляют или вычитают из даты/времени: created_at + INTERVAL '30 days', paid_at + INTERVAL '1 month'. Аналитику он нужен для окон «за последние N дней», сроков действия подписки и когортных диапазонов. Диалекты различаются синтаксисом: в PostgreSQL длительность в кавычках (INTERVAL '1 day'), в MySQL без кавычек с ключевым словом (INTERVAL 1 DAY), а в SQLite типа interval нет вообще — сдвиг делают модификаторами datetime(col, '+1 day').

Синтаксис

-- PostgreSQL timestamp + INTERVAL '30 days' timestamp - INTERVAL '3 months' timestamp + 2 * INTERVAL '1 week' -- MySQL timestamp + INTERVAL 30 DAY -- SQLite (нет типа interval) datetime(col, '+1 day', '-2 hours')

Примеры использования

Пример 1: Заказы за 30 дней (PostgreSQL)

SELECT COUNT(*) AS recent
FROM orders
WHERE created_at >= NOW() - INTERVAL '30 days';

Результат:

recent
------
2451

Пример 2: Дата окончания Pro-подписки

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

Пример 3: Умножение интервала

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-задачи в тренажёре →

Типичная ошибка

INTERVAL '1 month' считается по календарю, а не как фиксированные 30 дней: 31 января + 1 месяц = 28 февраля, поэтому '30 days' и '1 month' дают разный результат. В PostgreSQL длительность в кавычках, в MySQL — без. В SQLite типа interval нет: используйте date(col, '+7 day') / datetime(col, '-1 month').

Где спрашивают на собеседовании

Спрашивают в задачах с диапазонами дат, сроками действия и когортными окнами; в паре с NOW()/CURRENT_DATE и DATE_TRUNC.

FAQ: частые вопросы про INTERVAL

Как делать арифметику дат в SQLite, если INTERVAL нет?

В SQLite нет типа interval — вместо него передают модификаторы в функции date() и datetime(): date(col, '+7 day'), datetime(col, '-1 month', '+3 hours'). Модификаторы можно комбинировать, и месяцы SQLite тоже считает по календарю. Синтаксис INTERVAL '...' там работать не будет.

В чём разница между INTERVAL '30 days' и INTERVAL '1 month'?

'30 days' — это всегда ровно 30 суток. '1 month' — календарный месяц переменной длины (28–31 день), и результат зависит от исходной даты. Для точных окон берите дни, для «через месяц по календарю» — месяцы; они могут дать разные даты.

Как записать интервал в MySQL?

В MySQL без кавычек и с ключевым словом единицы: NOW() - INTERVAL 30 DAY, created_at + INTERVAL 1 MONTH. Есть также функции DATE_ADD(created_at, INTERVAL 1 MONTH) и DATE_SUB(...). Кавычки, как в PostgreSQL (INTERVAL '30 days'), тут не используются.

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы SQL

Работа с датами

Другие функции SQL

LAG · date_trunc · EXTRACT · strftime · TO_CHAR · AGE

Открыть SQL-тренажёр (565 задач) →