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

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

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

Для вычета одного дня из текущей даты на 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 часа назад.

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

Что, если вычитать день на границе месяцев? 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 для вычитания дат.