Как вычесть день из даты в SQL: функция DATEDIFF и другие
Быстрый ответ
Для вычета одного дня из текущей даты на SQL Server используется функция DATEADD
:
SELECT DATEADD(day, -1, GETDATE());
На MySQL требуется функция DATE_SUB
:
SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);
Для PostgreSQL выглядит так:
SELECT NOW() – INTERVAL '1 day';
Во всех этих примерах мы смещаем время на 24 часа назад.
Уверенное вычитание дат в различных сценариях
Вычитание дня из пользовательских переменных
Представим, что у вас есть @CreatedDate
, дата создания, и вы хотите узнать дату предыдущего дня:
DECLARE @CreatedDate DATETIME = '2023-01-15 08:00:00';
SELECT DATEADD(day, -1, @CreatedDate);
Результатом будет время, смещённое на 24 часа назад.
Учёт конца месяца при вычитании
Что, если вычитать день на границе месяцев? DATEADD
справится с этим:
SELECT DATEADD(day, -1, '2023-03-01');
SQL корректно обрабатывает високосные годы и переходы между месяцами.
Управление временными компонентами datetime
Функция DATEADD
сохраняет временной компонент. Если вам требуется только дата:
SELECT CAST(DATEADD(day, -1, @CreatedDate) AS DATE);
Вы получите именно дату, без времени.
Визуализация
Для наглядности продемонстрируем процесс отката времени на один день:
Сегодня: [🌕, 🌕, 🌕, 🌑] Перед вычетом: [ , , , 🚂]
Выполняем вычитание дня:
UPDATE TimeTable SET DepartureTime = DATE_SUB(DepartureTime, INTERVAL 1 DAY);
После вычета: [ , , 🚂, ]
Мы успешно “откатили” время.
Применение на различных платформах баз данных
Помимо SQL Server, MySQL и PostgreSQL, важно учесть специфику работы с датами в других СУБД.
В Oracle SQL
Чтобы вычесть день из текущей даты в Oracle, просто отнимите единицу:
SELECT SYSDATE – 1 FROM DUAL;
Учёт перехода на летнее/зимнее время (DST)
Помните о том, что переход на летнее/зимнее время может изменить продолжительность суток.
Вычитание разного количества дней
Для вычитания произвольного числа дней можно использовать переменную:
DECLARE @DaysToSubtract INT = 1;
SELECT DATEADD(day, -@DaysToSubtract, GETDATE());
Осторожно: високосный год
Не забывайте, что функция DATEADD
сама учитывает 29 февраля в высокосных годах.
Разбор функций работы с датами
Понимание механизма функций обработки дат поможет избежать ошибок.
DATEDIFF
против DATEADD
DATEDIFF
вычисляет разницу между датами, а DATEADD
смещает дату на указанный интервал:
SELECT DATEDIFF(day, '2023-01-14', '2023-01-15'); -- Результат: 1
SELECT DATEADD(day, -1, '2023-01-15'); -- Результат: '2023-01-14'
Проверка результатов работы с датами
Всегда проверяйте результаты манипуляций с датами, чтобы удовлетворить бизнес-требования.
Доверяйте, но проверяйте
Используйте DATEADD
для точного отсчёта времени, учитывайте часовые пояса и всегда проверяйте полученные даты на корректность.
Полезные материалы
- MySQL :: Руководство по MySQL 8.0 :: 12.7 Функции даты и времени — подробный разбор функций даты и времени в MySQL.
- DATEADD (Transact-SQL) – SQL Server | Microsoft Learn — официальная документация на функцию
DATEADD
для SQL Server. - PostgreSQL: Документация: 16: 9.9. Функции даты/времени и операторы — информация о функциях даты и времени в PostgreSQL.
- Функции даты и времени SQLite — обзор функций даты и времени в SQLite.
- EXTRACT (datetime) — арифметика дат в Oracle Database.
- Функция MySQL DATE_SUB() – w3resource — урок по использованию функции
DATE_SUB
в MySQL для вычитания дат.