
В SQL работа с датами требует точного понимания встроенных функций для арифметики времени. Вычитание дней из даты позволяет корректно формировать отчёты, управлять сроками и фильтровать данные по временным интервалам. Основные подходы зависят от используемой СУБД: в MySQL применяется функция DATE_SUB(), в PostgreSQL – оператор — INTERVAL, в SQL Server – функция DATEADD() с отрицательным значением.
В MySQL для вычитания 10 дней из текущей даты используется конструкция DATE_SUB(CURDATE(), INTERVAL 10 DAY). Такой метод позволяет автоматически учитывать високосные годы и длину месяцев, избегая ручного вычисления дат. В PostgreSQL аналогичный результат достигается выражением CURRENT_DATE — INTERVAL ’10 days’, что возвращает тип date и корректно работает с типами timestamp.
SQL Server реализует вычитание через DATEADD(DAY, -10, GETDATE()), где отрицательное значение аргумента DAY уменьшает дату. Для всех СУБД важно проверять результат на границе месяцев и лет, чтобы избежать неожиданных сдвигов. Практика показывает, что использование встроенных функций повышает производительность запросов и снижает вероятность ошибок при манипуляциях с датами.
Выбор метода зависит от контекста задачи: формирование временных интервалов для аналитики, настройка расписаний или вычисление дедлайнов. Знание точного синтаксиса и особенностей СУБД позволяет писать компактные запросы и интегрировать их в сложные отчётные системы без дополнительной обработки дат на стороне приложения.
Вычитание дней из даты в SQL: примеры и синтаксис
Для вычитания дней из даты в SQL применяются функции и арифметические операции, которые зависят от конкретной СУБД. В MySQL используется функция DATE_SUB(). Синтаксис:
DATE_SUB(дата, INTERVAL количество_дней DAY)
Пример: вычтем 10 дней из текущей даты:
SELECT DATE_SUB(CURDATE(), INTERVAL 10 DAY);
В PostgreSQL можно использовать оператор вычитания интервала:
SELECT CURRENT_DATE — INTERVAL ’10 days’;
Для SQL Server применяется функция DATEADD() с отрицательным значением:
SELECT DATEADD(DAY, -10, GETDATE());
При работе с таблицами вычитание дней удобно использовать в WHERE для фильтрации записей. Например, получить записи старше 30 дней:
MySQL:
SELECT * FROM orders WHERE order_date < DATE_SUB(CURDATE(), INTERVAL 30 DAY);
PostgreSQL:
SELECT * FROM orders WHERE order_date < CURRENT_DATE — INTERVAL ’30 days’;
SQL Server:
SELECT * FROM orders WHERE order_date < DATEADD(DAY, -30, GETDATE());
Рекомендации: всегда проверяйте тип данных столбца даты. Для корректной работы функций DATE_SUB, DATEADD и операций с интервалами столбец должен быть DATE или DATETIME. Для больших объемов данных использование встроенных функций эффективнее вычисления через арифметику строк.
Использование функции DATE_SUB для уменьшения даты на заданное количество дней
Функция DATE_SUB применяется для вычитания определённого интервала времени из даты. Основной синтаксис: DATE_SUB(дата, INTERVAL количество ДНЕЙ). Параметр дата может быть как полем таблицы типа DATE или DATETIME, так и конкретной датой в формате 'YYYY-MM-DD'.
Пример уменьшения текущей даты на 7 дней: SELECT DATE_SUB(CURDATE(), INTERVAL 7 DAY);. Результат вернёт дату неделю назад относительно сегодняшнего дня.
Для работы с полем таблицы используйте следующий синтаксис: SELECT order_id, DATE_SUB(order_date, INTERVAL 10 DAY) AS adjusted_date FROM orders;. В этом случае к каждому значению столбца order_date применяется вычитание 10 дней, а результат сохраняется под псевдонимом adjusted_date.
Функция поддерживает отрицательные значения интервала, что позволяет использовать DATE_SUB как эквивалент DATE_ADD. Например, DATE_SUB('2025-10-04', INTERVAL -5 DAY) прибавит 5 дней к дате.
Для сложных запросов с фильтрацией по уменьшенной дате можно использовать конструкции: WHERE DATE_SUB(event_date, INTERVAL 30 DAY) < NOW(). Это позволяет выбирать записи, где событие произошло более 30 дней назад относительно текущего момента.
Вычитание дней через оператор INTERVAL в MySQL
В MySQL для вычитания дней из даты используется оператор INTERVAL совместно с функцией DATE_SUB или арифметикой с датами. Синтаксис позволяет точно уменьшать дату на указанное количество дней.
Базовый формат с DATE_SUB:
DATE_SUB(дата, INTERVAL количество_дней DAY)
Пример: вычтем 10 дней из текущей даты:
SELECT DATE_SUB(NOW(), INTERVAL 10 DAY) AS new_date;
Результат вернёт дату и время, уменьшенные на 10 дней. Для работы только с датой без времени используется CURDATE():
SELECT DATE_SUB(CURDATE(), INTERVAL 30 DAY) AS previous_month_date;
Можно использовать оператор - INTERVAL прямо в выражении:
SELECT NOW() - INTERVAL 7 DAY AS week_ago;
Пример применения в таблице:
| Запрос | Описание | Результат |
|---|---|---|
SELECT order_id, order_date, order_date - INTERVAL 15 DAY AS reminder_date FROM orders; |
Вычисляет дату напоминания на 15 дней раньше даты заказа. | Таблица с колонками order_id, order_date, reminder_date. |
SELECT DATE_SUB(delivery_date, INTERVAL 3 DAY) AS alert_date FROM shipments; |
Создаёт колонку с датой уведомления за 3 дня до доставки. | Только даты без времени, уменьшенные на 3 дня. |
Рекомендации:
- Используйте
DATE_SUBдля читаемости при сложных запросах. - Для простого вычитания дней в арифметике с датами достаточно
- INTERVAL n DAY. - Для работы с временными метками лучше применять
NOW(), для чистых дат –CURDATE(). - При вычитании большого количества дней проверяйте переход через месяц и год.
Применение функции DATEADD с отрицательным значением в SQL Server

Функция DATEADD позволяет вычитать дни из даты, используя отрицательные значения в параметре интервала. Синтаксис выглядит так: DATEADD(день, -N, дата), где N – количество дней для вычитания, а дата – исходная дата.
Пример вычитания 10 дней из текущей даты: SELECT DATEADD(DAY, -10, GETDATE()) AS НоваяДата; Результат вернет дату, которая на 10 дней меньше текущей.
DATEADD с отрицательным значением можно комбинировать с другими функциями для фильтрации данных. Например, чтобы выбрать все заказы за последние 30 дней от текущей даты: SELECT * FROM Orders WHERE OrderDate >= DATEADD(DAY, -30, GETDATE());
Для работы с таблицами, где даты хранятся в столбцах, вычитание выполняется аналогично: UPDATE Employees SET VacationEnd = DATEADD(DAY, -7, VacationEnd); уменьшает дату окончания отпуска на 7 дней для всех сотрудников.
При работе с отрицательными значениями важно учитывать тип данных столбца. DATEADD корректно работает с DATE, DATETIME, DATETIME2. Попытка использования с несовместимыми типами приведет к ошибке.
DATEADD с отрицательными интервалами полезен для расчета дедлайнов, отчетных периодов и исторических данных без необходимости вручную вычислять даты.
Вычитание дней из даты в PostgreSQL с помощью оператора «-»
В PostgreSQL для вычитания дней из даты используется оператор «-» вместе с интервалом. Формат записи: дата - INTERVAL 'n days', где n – количество дней, которое необходимо вычесть.
Пример вычитания 10 дней из текущей даты:
SELECT CURRENT_DATE - INTERVAL '10 days';
Результат вернёт дату, которая на 10 дней раньше текущей.
Для работы с конкретной датой можно использовать литерал даты:
SELECT DATE '2025-10-04' - INTERVAL '15 days';
Этот запрос вернёт 2025-09-19, так как вычтено 15 дней.
Если требуется результат в виде числа дней, можно привести интервал к типу DATE или использовать функцию EXTRACT(DAY FROM …), но для простого смещения дат достаточно оператора «-» с интервалом.
Оператор «-» поддерживает и отрицательные значения, что позволяет добавлять дни:
SELECT DATE '2025-10-04' - INTERVAL '-7 days';
Этот запрос эквивалентен прибавлению 7 дней, возвращая 2025-10-11.
Рекомендация: для динамических вычислений используйте выражения с CURRENT_DATE или колонками типа DATE, а для фиксированных смещений удобно применять литералы интервала с явным указанием единиц 'n days', чтобы избежать ошибок при преобразованиях типов.
Сравнение результатов вычитания дат с CURRENT_DATE и NOW()
В SQL функции CURRENT_DATE и NOW() возвращают разные типы данных, что напрямую влияет на результат операций вычитания дней.
CURRENT_DATEвозвращает только дату без времени. При вычитании, например, 5 дней:SELECT CURRENT_DATE - INTERVAL '5 days';результат – дата ровно 5 дней назад, без временной компоненты.
NOW()возвращает дату с текущим временем. При вычитании дней:SELECT NOW() - INTERVAL '5 days';результат содержит и дату, и точное время, что важно для операций с временными метками.
Разница проявляется в агрегатных функциях и сравнении дат:
- Сравнение с датой:
SELECT * FROM orders WHERE order_date >= CURRENT_DATE - INTERVAL '7 days';вернет все заказы начиная с полуночи 7 дней назад.
- Сравнение с точным временем:
SELECT * FROM orders WHERE order_timestamp >= NOW() - INTERVAL '7 days';вернет заказы за последние 7 дней с точностью до секунды.
Рекомендации:
- Используйте
CURRENT_DATE, когда важна только календарная дата. - Используйте
NOW(), когда нужна точная временная метка для анализа по часам, минутам или секундам. - При комбинировании с типами
DATEиTIMESTAMPучитывайте явное приведение типов, чтобы избежать ошибок или неявных преобразований.
Создание запросов с динамическим количеством дней для вычитания

В SQL для вычитания переменного количества дней часто используют параметры или подзапросы. Ниже приведены конкретные примеры для популярных СУБД.
- PostgreSQL: динамическое вычитание через параметр:
SELECT order_id, order_date - INTERVAL '1 day' * :days_to_subtract AS new_date
FROM orders;
Здесь :days_to_subtract – числовой параметр, передаваемый при выполнении запроса. Умножение на INTERVAL '1 day' позволяет вычитать любое количество дней.
DATE_SUB с переменной:SET @days_to_subtract = 5;
SELECT order_id, DATE_SUB(order_date, INTERVAL @days_to_subtract DAY) AS new_date
FROM orders;
Можно изменять значение @days_to_subtract в зависимости от бизнес-логики или пользовательского ввода.
DATEADD с отрицательным значением:DECLARE @days_to_subtract INT = 7;
SELECT order_id, DATEADD(DAY, -@days_to_subtract, order_date) AS new_date
FROM orders;
Отрицательное значение параметра позволяет динамически уменьшать дату.
Для динамических расчетов можно применять подзапросы или значения из других таблиц:
-- PostgreSQL пример с подзапросом
SELECT o.order_id, o.order_date - INTERVAL '1 day' * d.days AS new_date
FROM orders o
JOIN discount_days d ON o.customer_id = d.customer_id;
Рекомендации при работе с динамическими днями:
- Используйте параметризованные запросы для предотвращения SQL-инъекций.
- Проверяйте, что параметр не отрицательный, если логика не допускает увеличение даты.
- Для больших таблиц используйте индексы на колонке даты, чтобы избежать снижения производительности.
- В сложных вычислениях лучше предварительно формировать количество дней в отдельной колонке или CTE.
Вопрос-ответ:
Как в SQL отнять определённое количество дней от текущей даты?
В SQL для уменьшения даты на определённое количество дней чаще всего используют функции DATEADD или INTERVAL в зависимости от СУБД. Например, в SQL Server можно написать: SELECT DATEADD(DAY, -5, GETDATE()), что вернёт дату на 5 дней раньше текущей. В MySQL для аналогичной операции используют запись: SELECT CURDATE() - INTERVAL 5 DAY;.
Можно ли вычитать дни из даты в SQL с учётом рабочих и выходных дней?
Стандартные функции SQL вычитают календарные дни без разделения на рабочие и выходные. Чтобы учитывать только рабочие дни, необходимо использовать дополнительную таблицу с календарём или писать пользовательскую функцию. Например, можно создать таблицу с датами и пометками рабочих дней, затем выбирать даты, уменьшенные на N рабочих дней, пропуская выходные.
Как правильно вычитать переменное количество дней, передаваемое в параметре?
Если количество дней хранится в переменной, его можно использовать в функциях SQL напрямую. В SQL Server это может выглядеть так: DECLARE @days INT = 7; SELECT DATEADD(DAY, -@days, GETDATE());. В MySQL: SET @days = 7; SELECT CURDATE() - INTERVAL @days DAY;. Такой подход позволяет динамически изменять число дней без изменения кода запроса.
Что делать, если результат вычитания дней должен возвращать только дату без времени?
Многие функции SQL возвращают дату с частью времени. Чтобы оставить только дату, используют преобразование или функции округления. В SQL Server можно написать: SELECT CAST(DATEADD(DAY, -10, GETDATE()) AS DATE);. В MySQL можно использовать: SELECT DATE(CURDATE() - INTERVAL 10 DAY);. Это убирает компонент времени и оставляет только дату.
Есть ли разница в синтаксисе вычитания дней между разными СУБД?
Да, синтаксис отличается. В SQL Server используют DATEADD с отрицательным числом дней. В MySQL применяют INTERVAL, в Oracle — функцию ADD_MONTHS для месяцев и выражения с датами для дней. Например, в Oracle вычитание 7 дней может выглядеть так: SELECT SYSDATE - 7 FROM DUAL;. Эти различия нужно учитывать при переносе запросов между СУБД.
Как в SQL вычесть определённое количество дней из даты?
В SQL для вычитания дней из даты можно использовать встроенные функции, которые зависят от конкретной СУБД. Например, в PostgreSQL применяется оператор «-» с интервалом: SELECT current_date - INTERVAL '5 days';. В MySQL используют функцию DATE_SUB: SELECT DATE_SUB(NOW(), INTERVAL 5 DAY);. В Oracle используется функция SYSDATE - 5, где число просто вычитает дни из текущей даты. Такой подход позволяет легко получать прошлые даты для отчетов или фильтров данных.
Можно ли вычитать дни из столбца с датами, а не только из текущей даты?
Да, вычитать дни можно из любого столбца с типом даты или времени. Например, в MySQL запрос SELECT order_date, DATE_SUB(order_date, INTERVAL 7 DAY) AS new_date FROM orders; вернёт для каждой даты заказа значение на 7 дней меньше. В PostgreSQL это делается через: SELECT order_date, order_date - INTERVAL '7 days' AS new_date FROM orders;. В Oracle можно написать SELECT order_date, order_date - 7 AS new_date FROM orders;. Такой приём удобен для анализа исторических данных и построения временных отчётов.
