Бесплатный вебинар
«как найти любимую работу»
Подарки на 150 000 ₽ за участие
Живой эфир
Записи не будет!
00:00:00:00
дн.ч.мин.сек.

Как вычесть день из даты в SQL: функция DATEDIFF и другие

Быстрый ответ

Для вычета одного дня из текущей даты на SQL Server используется функция DATEADD:

SQL
Скопировать код
SELECT DATEADD(day, -1, GETDATE());

На MySQL требуется функция DATE_SUB:

SQL
Скопировать код
SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);

Для PostgreSQL выглядит так:

SQL
Скопировать код
SELECT NOW() – INTERVAL '1 day';

Во всех этих примерах мы смещаем время на 24 часа назад.

Кинга Идем в IT: пошаговый план для смены профессии

Уверенное вычитание дат в различных сценариях

Вычитание дня из пользовательских переменных

Представим, что у вас есть @CreatedDate, дата создания, и вы хотите узнать дату предыдущего дня:

SQL
Скопировать код
DECLARE @CreatedDate DATETIME = '2023-01-15 08:00:00';
SELECT DATEADD(day, -1, @CreatedDate);

Результатом будет время, смещённое на 24 часа назад.

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Учёт конца месяца при вычитании

Что, если вычитать день на границе месяцев? DATEADD справится с этим:

SQL
Скопировать код
SELECT DATEADD(day, -1, '2023-03-01');

SQL корректно обрабатывает високосные годы и переходы между месяцами.

Управление временными компонентами datetime

Функция DATEADD сохраняет временной компонент. Если вам требуется только дата:

SQL
Скопировать код
SELECT CAST(DATEADD(day, -1, @CreatedDate) AS DATE);

Вы получите именно дату, без времени.

Визуализация

Для наглядности продемонстрируем процесс отката времени на один день:

Сегодня: [🌕, 🌕, 🌕, 🌑] Перед вычетом: [ , , , 🚂]

Выполняем вычитание дня:

SQL
Скопировать код
UPDATE TimeTable SET DepartureTime = DATE_SUB(DepartureTime, INTERVAL 1 DAY);

После вычета: [ , , 🚂, ]

Мы успешно “откатили” время.

Применение на различных платформах баз данных

Помимо SQL Server, MySQL и PostgreSQL, важно учесть специфику работы с датами в других СУБД.

В Oracle SQL

Чтобы вычесть день из текущей даты в Oracle, просто отнимите единицу:

SQL
Скопировать код
SELECT SYSDATE – 1 FROM DUAL;

Учёт перехода на летнее/зимнее время (DST)

Помните о том, что переход на летнее/зимнее время может изменить продолжительность суток.

Вычитание разного количества дней

Для вычитания произвольного числа дней можно использовать переменную:

SQL
Скопировать код
DECLARE @DaysToSubtract INT = 1;
SELECT DATEADD(day, -@DaysToSubtract, GETDATE());

Осторожно: високосный год

Не забывайте, что функция DATEADD сама учитывает 29 февраля в высокосных годах.

Разбор функций работы с датами

Понимание механизма функций обработки дат поможет избежать ошибок.

DATEDIFF против DATEADD

DATEDIFF вычисляет разницу между датами, а DATEADD смещает дату на указанный интервал:

SQL
Скопировать код
SELECT DATEDIFF(day, '2023-01-14', '2023-01-15');  -- Результат: 1

SELECT DATEADD(day, -1, '2023-01-15');  -- Результат: '2023-01-14'

Проверка результатов работы с датами

Всегда проверяйте результаты манипуляций с датами, чтобы удовлетворить бизнес-требования.

Доверяйте, но проверяйте

Используйте DATEADD для точного отсчёта времени, учитывайте часовые пояса и всегда проверяйте полученные даты на корректность.

Полезные материалы

  1. MySQL :: Руководство по MySQL 8.0 :: 12.7 Функции даты и времени — подробный разбор функций даты и времени в MySQL.
  2. DATEADD (Transact-SQL) – SQL Server | Microsoft Learn — официальная документация на функцию DATEADD для SQL Server.
  3. PostgreSQL: Документация: 16: 9.9. Функции даты/времени и операторы — информация о функциях даты и времени в PostgreSQL.
  4. Функции даты и времени SQLite — обзор функций даты и времени в SQLite.
  5. EXTRACT (datetime) — арифметика дат в Oracle Database.
  6. Функция MySQL DATE_SUB() – w3resource — урок по использованию функции DATE_SUB в MySQL для вычитания дат.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой SQL-запрос используется для вычитания одного дня из текущей даты на SQL Server?
1 / 5