Вычитание месяца и дней в MySQL: точные расчёты

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

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

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

Если вам необходимо вычесть из текущей даты один месяц и четыре дня в MySQL, воспользуйтесь следующим запросом:

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

Запустите его, и оп — быстро переместились на месяц и четыре дня назад! 🎉

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

Что происходит за кулисами?

Учёт различной продолжительности месяцев

Функция DATE_SUB() автоматически учитывает разную продолжительность месяцев. При вычитании месяца из 31 января, MySQL вернёт вам 31 декабря, так как в феврале нет 31-го числа.

SQL
Скопировать код
SELECT DATE_SUB('2021-01-31', INTERVAL 1 MONTH);
-- Результат: 2020-12-31

Високосные годы – не проблема

При работе с високосным годом и вычитанием месяца из даты 1 марта результатом будет дата 1 февраля, а не 29 февраля. Чудеса автоматики MySQL!

SQL
Скопировать код
SELECT DATE_SUB('2024-03-01', INTERVAL 1 MONTH);
-- Результат: 2024-02-01

Время движется вперёд

Если важно учесть также и текущее время, следует использовать функцию NOW(). Если же достаточно просто даты, подойдёт функция CURDATE().

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

Использование других возможностей SQL

Вычитание без вычитания? Ознакомьтесь с этим трюком!

Функция DATE_ADD() также может выполнять вычитание, если указать отрицательный интервал. Неожиданное решение, не правда ли?

SQL
Скопировать код
SELECT DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -4 DAY);

Немного дополнительного вычитания

Можно осуществить множественное вычитание при вложенном использовании функции DATE_ADD.

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

Предотвращение создания недействительных дат

Функция DATE_SUB() позволяет избежать получения несуществующих дат:

SQL
Скопировать код
SELECT DATE_SUB('2021-03-31', INTERVAL 1 MONTH + INTERVAL 4 DAY);
-- Результат: 2021-02-25

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

Представьте себе ваше путешествие назад во времени как бег по календарю:

Markdown
Скопировать код
Старт: 📅 2021-12-15

Минус месяц: 🔄🗓️

Markdown
Скопировать код
Промежуточная точка: 📅 2021-11-15

Минус четыре дня: 🔄📆

Markdown
Скопировать код
Финиш: 📅 2021-11-11

Ваше путешествие в прошлое на один месяц и четыре дня успешно завершено. 👟

Ошибки, которых следует избегать

Специфические случаи

Будьте готовы к непредсказуемым результатам при работе с такими особенными периодами, как февраль или високосные годы. Правильный подход к исключениям поможет сохранить корректность SQL-запросов.

Учёт совместимости

Обязательно проверяйте совместимость этих функций с вашей версией MySQL перед их использованием.

Вопрос производительности

Учтите, что обработка больших объемов данных может повлиять на производительность. При необходимости примените меры оптимизации, например, индексацию или кэширование.

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

  1. Функция MySQL DATE_SUB() — подробная информация о функции DATE_SUB в MySQL.
  2. MySQL: Руководство по MySQL 8.0: 14.7 Функции даты и времени — обзор функций обработки даты и времени в официальной документации MySQL.
  3. Возможные ошибки в рефакторинге кода (PHP) – Stack Overflow – общественное обсуждение на Stack Overflow, которое может быть полезным.
  4. MySQL: Руководство по MySQL 5.7: 12.7 Функции даты и времени — дополнительные сведения в руководстве по MySQL.
  5. Функция MySQL DATE_SUB() — database.guide — полезные примеры использования MySQL для манипуляций с датами и временем.