Получение последнего дня месяца в SQL: общее решение

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

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

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

Чтобы определить последний день месяца, вы можете использовать функцию EOMONTH в SQL:

SQL
Скопировать код
SELECT EOMONTH(GETDATE()) AS LastDay;

Если же вы используете версии SQL Server ранее 2012 года, тогда вам потребуется сочетание функций DATEADD и DATEDIFF. Это позволит извлечь первый день следующего месяца и вычесть из него один день:

SQL
Скопировать код
SELECT DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + 1, 0)) AS LastDay;
Кинга Идем в IT: пошаговый план для смены профессии

Искусство вычислений

Важно быть готовым решать нетривиальные задачи. Давайте рассмотрим некоторые из них:

Учет високосных годов

В високосные годы февраль имеет 29 дней. Функция EOMONTH легко справляется с такими ситуациями.

SQL
Скопировать код
SELECT EOMONTH('2024-02-01') AS LastDayOfLeapYearFeb; -- Возвращает 2024-02-29
Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Упрощение кода с использованием переменных

Для того чтобы код был более читаемым и повторно используемым, рекомендуется использовать переменную для хранения даты:

SQL
Скопировать код
DECLARE @DateVariable DATE = GETDATE();
SELECT EOMONTH(@DateVariable) AS LastDay;

Навигация по месяцам

Функция EOMONTH позволяет "путешествовать" вперед и назад по месяцам, передавая второй параметр:

SQL
Скопировать код
SELECT EOMONTH(GETDATE(), 1) AS LastDayNextMonth; -- Получаем последний день следующего месяца
SELECT EOMONTH(GETDATE(), -1) AS LastDayLastMonth; -- Получаем последний день предыдущего месяца

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

Наглядно представим, как работают вышеописанные функции:

Markdown
Скопировать код
Выбираем случайную дату, как фокусник вытягивает карту из колоды.

Каждая дата — это остановка на маршруте по месяцам. Большинство месяцев имеют продолжительность 30-31 день, но есть определенные исключения, например, февраль.

Функция `EOMONTH` омогает нам безошибочно найти последний день каждого месяца.
SQL
Скопировать код
EOMONTH(TargetDate) -- Доставит вас до конечной точки вашего месячного маршрута.
Markdown
Скопировать код
Конечная точка, февраль 2023! Ваша станция: [28]
Последняя остановка, декабрь 2023! Готовы выходить: [31]

Оценка производительности

Эффективность используемого подхода крайне важна, особенно при работе с большими данными:

  • Использование EOMONTH — это быстрый и эффективный способ обработки объемных данных.

  • Сочетание DATEADD и DATEDIFF может быть слегка громоздким, но оно надежно и выполнит задачу.

Поддержка старых версий SQL Server

Пользователям устаревших версий SQL Server, тем, кто «застрял во времени», рекомендуется использовать DATEADD:

SQL
Скопировать код
SELECT DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, @DateVariable) + 1, 0)) AS LastDay;

Этот метод предотвращает проблемы, связанные с манипуляциями со строками и преобразованием типов.

Гибкость при работе с датами

Предложенный подход гибок и адаптируется под различные требования к обработке дат в базах данных. Вы без труда сможете переключаться от использования GETDATE() к другим форматам исходных данных.

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

  1. Oracle / PLSQL: Функция LAST_DAY — Ознакомьтесь с функцией LAST_DAY в Oracle/PLSQL.
  2. DATEADD (Transact-SQL) – SQL Server | Microsoft Learn — Официальная документация от Microsoft по работе с функцией DATEADD.
  3. Как динамически присвоить атрибут 'onclick' в JavaScript? – Stack Overflow — Несмотря на то, что эта ссылка не относится к теме статьи, информация о работе с атрибутом onclick в JavaScript может оказаться полезной.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какую функцию следует использовать для получения последнего дня месяца в SQL Server 2012 и позже?
1 / 5