MONTH: примеры (SQL)

Использование MONTH в SQL Server: извлечение месяца из даты
Раздел: Даты и времени функции, Дата и время
MONTH(date): int

Описание функции MONTH в MS SQL

Функция MONTH является встроенной скалярной функцией в Microsoft SQL Server, предназначенной для извлечения числового значения месяца из заданной даты. Она используется в сценариях, требующих анализа, группировки или фильтрации данных по месяцам, например, при построении отчетов, анализе временных рядов или вычислении периодических показателей.

Синтаксис функции предельно прост: MONTH(date). В качестве единственного аргумента date принимает любое допустимое выражение даты и времени, которое может быть приведено к типам date, datetime, datetime2, datetimeoffset или smalldatetime. Функция возвращает целое число типа int в диапазоне от 1 (январь) до 12 (декабрь). Если аргумент имеет значение NULL, результатом также будет NULL.

Основные примеры применения

Извлечение месяца из конкретной даты или столбца таблицы.

SELECT MONTH('2023-11-22') AS MonthNumber;
MonthNumber
------------
11

Использование с полем таблицы и фильтрация по месяцу.

SELECT OrderID, OrderDate
FROM Orders
WHERE MONTH(OrderDate) = 3;

Группировка данных по месяцу для агрегации.

SELECT MONTH(EventDate) AS EventMonth, COUNT(*) AS EventCount
FROM Events
GROUP BY MONTH(EventDate)
ORDER BY EventMonth;

Похожие функции в MS SQL

YEAR и DAY — извлекают год и день месяца соответственно. Используются для получения других частей даты. DATEPART — более универсальная функция, которая может извлекать не только месяц (DATEPART(month, date)), но и множество других компонентов (квартал, неделя, час). Её предпочтительнее использовать, когда необходим единообразный синтаксис для извлечения разных частей даты или когда нужен компонент, недоступный через отдельные функции (например, микросекунды). Функция DATENAME возвращает название месяца в виде строки, что полезно для формирования читаемых отчётов.

Аналоги функции в других СУБД

MySQL: Функция MONTH() идентична по поведению. Пример: SELECT MONTH('2023-07-15'); вернёт 7.

Oracle: Используется функция EXTRACT(MONTH FROM date). Пример: SELECT EXTRACT(MONTH FROM DATE '2023-07-15') FROM dual; вернёт 7.

PostgreSQL: Аналогично Oracle, поддерживает EXTRACT(MONTH FROM date). Также можно использовать DATE_PART('month', date). Пример: SELECT EXTRACT(MONTH FROM TIMESTAMP '2023-07-15');

SQLite: Не имеет отдельной функции. Месяц извлекается с помощью strftime('%m', date), который возвращает строку. Пример: SELECT strftime('%m', '2023-07-15'); вернёт '07'.

Распространенные ошибки

Передача аргумента несовместимого типа приводит к ошибке преобразования.

SELECT MONTH('Not a date');
Msg 241, Level 16, State 1
Conversion failed when converting date and/or time from character string.

Игнорирование того, что функция возвращает число, а не название. Для сортировки по месяцам в хронологическом порядке использование номера месяца корректно, но для вывода названия требуется DATENAME.

Неоптимальное использование в условиях WHERE на больших таблицах. Применение функции к столбцу препятствует использованию индексов. Лучше использовать диапазон дат.

-- Неоптимально:
SELECT * FROM Sales WHERE MONTH(SaleDate) = 12;
-- Оптимально:
SELECT * FROM Sales WHERE SaleDate >= '2023-12-01' AND SaleDate < '2024-01-01';

Изменения в последних версиях

Поведение функции MONTH остаётся стабильным на протяжении всех современных версий SQL Server (2008 и выше). Основные изменения связаны не с самой функцией, а с расширением поддерживаемых типов данных для аргумента date. Например, в SQL Server 2008 были добавлены типы date, datetime2 и datetimeoffset, которые также стали допустимыми входными аргументами для функции.

Расширенные примеры использования

Определение финансового квартала на основе месяца.

Пример sql
SELECT SaleDate,
       CASE
           WHEN MONTH(SaleDate) BETWEEN 1 AND 3 THEN 'Q1'
           WHEN MONTH(SaleDate) BETWEEN 4 AND 6 THEN 'Q2'
           WHEN MONTH(SaleDate) BETWEEN 7 AND 9 THEN 'Q3'
           ELSE 'Q4'
       END AS FiscalQuarter
FROM Sales;

Динамическое формирование периода для выборки за предыдущий месяц.

Пример sql
DECLARE @CurrentDate DATE = GETDATE();
SELECT *
FROM Events
WHERE MONTH(EventDate) = MONTH(DATEADD(month, -1, @CurrentDate))
  AND YEAR(EventDate) = YEAR(DATEADD(month, -1, @CurrentDate));

Агрегация с приведением дат к началу месяца для использования в оконных функциях.

Пример sql
SELECT DISTINCT
       DATEFROMPARTS(YEAR(OrderDate), MONTH(OrderDate), 1) AS OrderMonth,
       SUM(TotalDue) OVER (PARTITION BY YEAR(OrderDate), MONTH(OrderDate)) AS MonthlyTotal
FROM Sales.SalesOrderHeader
ORDER BY OrderMonth;

Поиск записей, где месяц совпадает с текущим, независимо от года.

Пример sql
SELECT *
FROM Promotions
WHERE MONTH(StartDate) = MONTH(GETDATE());

MS SQL MONTH function comments

En
MONTH Returns the month part of a date