
В SQL часто требуется определить первый день текущего или заданного месяца для фильтрации данных по временным периодам. Для большинства СУБД существует несколько способов получить этот результат без использования сложных вычислений. В PostgreSQL и MySQL можно использовать функции DATE_TRUNC и DATE_FORMAT соответственно для быстрого преобразования даты в начало месяца.
В SQL Server получение первого числа месяца удобно реализовать через комбинацию функций DATEADD и EOMONTH. Например, DATEADD(DAY, 1, EOMONTH(дата, -1)) возвращает первый день месяца для любой заданной даты, включая корректную обработку високосных годов и перехода между годами.
При работе с Oracle эффективным вариантом является использование функции TRUNC с указанием формата ‘MM’: TRUNC(дата, ‘MM’). Это позволяет сразу получить дату без времени, что важно при сравнении в WHERE и при группировке по месяцам.
Выбор подхода зависит от конкретной СУБД и требований к производительности. Использование встроенных функций сокращает код и снижает риск ошибок при ручных вычислениях первого дня месяца, особенно при обработке больших объемов данных.
Использование функции DATEADD для вычисления начала месяца

Функция DATEADD позволяет смещать дату на заданный интервал, что удобно для вычисления первого числа месяца.
Для получения первого числа текущего месяца используется комбинация DATEADD и функции DAY:
- Определяем текущую дату с помощью GETDATE().
- Вычисляем количество дней, прошедших с начала месяца: DAY(GETDATE()) — 1.
- Вычитаем это значение из текущей даты с помощью DATEADD. Результат – первое число месяца.
Пример запроса:
SELECT DATEADD(DAY, 1 - DAY(GETDATE()), GETDATE()) AS FirstDayOfMonth;
Для произвольной даты, заданной в столбце order_date, алгоритм аналогичен:
SELECT DATEADD(DAY, 1 - DAY(order_date), order_date) AS FirstDayOfMonth
FROM orders;
Особенности применения DATEADD:
- Работает с любым типом даты: datetime, date, smalldatetime.
- Сохраняет формат исходной даты.
- Позволяет легко адаптировать для вычисления первого дня предыдущего месяца: DATEADD(MONTH, -1, DATEADD(DAY, 1 — DAY(GETDATE()), GETDATE())).
Использование DATEADD в сочетании с DAY обеспечивает точное и быстрое вычисление начала месяца без необходимости дополнительных таблиц или функций.
Применение функции EOMONTH с корректировкой даты

Функция EOMONTH возвращает последний день месяца для заданной даты с возможностью смещения на указанное количество месяцев. Для получения первого числа месяца используется простая корректировка: прибавление одного дня к дате конца предыдущего месяца.
Пример запроса для SQL Server:
SELECT DATEADD(DAY, 1, EOMONTH('2025-10-05', -1)) AS FirstDayOfMonth;
Здесь:
| Параметр | Описание |
|---|---|
| ‘2025-10-05’ | Исходная дата, для которой определяем первый день месяца |
| -1 | Смещение на один месяц назад, чтобы получить конец предыдущего месяца |
| DATEADD(DAY, 1, …) | Прибавление одного дня для получения первого числа текущего месяца |
Для динамического вычисления первого дня текущего месяца без указания даты используется:
SELECT DATEADD(DAY, 1, EOMONTH(GETDATE(), -1)) AS FirstDayOfCurrentMonth;
Для получения первого дня следующего месяца достаточно изменить смещение на 0 внутри EOMONTH:
SELECT DATEADD(DAY, 1, EOMONTH(GETDATE(), 0)) AS FirstDayOfNextMonth;
Метод эффективен для любых отчетов и фильтров, где требуется строго первый день месяца, включая агрегированные запросы по периодам.
Получение первого числа месяца через CAST и CONVERT
В SQL для получения первого числа месяца можно использовать функции CAST и CONVERT, преобразуя дату к нужному формату и обнуляя день. Это особенно полезно при формировании отчетов или фильтров по месяцам.
Пример использования CAST:
SELECT CAST(DATEADD(DAY, 1-DAY(GETDATE()), GETDATE()) AS DATE) AS FirstOfMonth;
Объяснение:
| Функция | Назначение |
|---|---|
| GETDATE() | Возвращает текущую дату и время |
| DAY(GETDATE()) | Извлекает день месяца из текущей даты |
| DATEADD(DAY, 1-DAY(…), …) | Сдвигает дату на начало месяца |
| CAST(… AS DATE) | Приводит результат к типу DATE без времени |
Аналогичный результат достигается через CONVERT:
SELECT CONVERT(DATE, DATEADD(DAY, 1-DAY(GETDATE()), GETDATE())) AS FirstOfMonth;
Рекомендации по применению:
| Совет | Описание |
|---|---|
| Использовать CAST для универсальности | Работает в большинстве версий SQL Server и не зависит от стиля формата даты |
| CONVERT для контроля формата | Позволяет задавать стиль отображения даты при необходимости, например CONVERT(VARCHAR, DATE, 23) для ‘yyyy-mm-dd’ |
| Обнуление времени | Приведение к DATE исключает часы, минуты и секунды, что упрощает сравнение дат |
Метод подходит для построения выборок по месяцам, агрегации данных и фильтров на начало периода без необходимости использования сложных формул или подзапросов.
Вычисление начала месяца с помощью функции TRUNCATE в Oracle
В Oracle для определения первого числа месяца удобно использовать функцию TRUNC с указанием формата ‘MM’. Она обрезает дату до начала месяца, игнорируя день, часы, минуты и секунды.
Пример запроса:
SELECT TRUNC(SYSDATE, 'MM') AS first_day_of_month FROM dual;
Результат запроса возвращает дату первого числа текущего месяца, например 2025-10-01. Для любой другой даты вместо SYSDATE можно использовать поле таблицы:
SELECT TRUNC(order_date, 'MM') AS first_day_of_month FROM orders;
Если необходимо получить дату первого числа предыдущего месяца, применяется комбинация TRUNC и ADD_MONTHS:
SELECT TRUNC(ADD_MONTHS(SYSDATE, -1), 'MM') AS first_day_last_month FROM dual;
Использование TRUNC с форматом ‘MM’ гарантирует точное вычисление начала месяца без дополнительных вычислений и преобразований, что повышает читаемость и производительность SQL-запросов.
Использование EXTRACT для получения года и месяца
Функция EXTRACT позволяет извлечь отдельные компоненты даты, такие как год или месяц, что упрощает построение запросов для анализа данных по временным интервалам.
Синтаксис для извлечения года и месяца:
EXTRACT(YEAR FROM дата_или_столбец)
EXTRACT(MONTH FROM дата_или_столбец)
Пример получения года и месяца из столбца order_date:
SELECT
EXTRACT(YEAR FROM order_date) AS order_year,
EXTRACT(MONTH FROM order_date) AS order_month
FROM orders;
Рекомендации по использованию:
- Для фильтрации данных используйте
WHERE EXTRACT(MONTH FROM дата) = число_месяцаилиEXTRACT(YEAR FROM дата) = число_года. - При группировке данных по месяцам и годам удобно применять
GROUP BY EXTRACT(YEAR FROM дата), EXTRACT(MONTH FROM дата). - Для получения первого числа месяца на основе извлечённых компонентов используйте конструкцию
MAKE_DATE(EXTRACT(YEAR FROM дата)::int, EXTRACT(MONTH FROM дата)::int, 1)в PostgreSQL. - Учитывайте особенности разных СУБД: в MySQL аналогично работает функция
YEAR(дата)иMONTH(дата).
EXTRACT обеспечивает точное выделение компонентов даты без необходимости преобразований строк, что ускоряет запросы и упрощает агрегирование данных.
Формирование даты первого числа месяца через строковые операции
В SQL строки позволяют создавать дату первого числа месяца, выделяя год и месяц из исходной даты и добавляя фиксированное значение для дня. Например, в PostgreSQL можно использовать функцию TO_CHAR для извлечения компонентов даты и конкатенацию:
TO_DATE(TO_CHAR(дата, 'YYYY-MM') || '-01', 'YYYY-MM-DD'). Это превращает любую дату в первый день соответствующего месяца.
В MySQL применяется комбинация функций DATE_FORMAT и STR_TO_DATE:
STR_TO_DATE(DATE_FORMAT(дата, '%Y-%m-01'), '%Y-%m-%d'). Здесь DATE_FORMAT преобразует дату в строку вида ‘YYYY-MM’, к которой добавляется ‘-01’, а STR_TO_DATE возвращает результат как дату.
Для SQL Server подходит использование CONVERT и CAST:
CAST(CONVERT(varchar(7), дата, 120) + '-01' AS date). CONVERT получает строку ‘YYYY-MM’, после чего добавляется день, и результат приводится к типу date.
Строковые методы полезны при необходимости формировать даты без вычисления числовых значений месяца или при работе с текстовыми представлениями даты. Они обеспечивают одинаковый формат для всех исходных значений и просты для чтения и поддержки кода.
Рекомендуется проверять корректность форматов исходной даты и результирующей строки, чтобы избежать ошибок преобразования. Важно учитывать различия форматов между СУБД и использовать соответствующие функции конвертации.
Работа с временными интервалами и первым днём месяца в PostgreSQL

В PostgreSQL для получения первого числа месяца удобно использовать функцию date_trunc('month', дата). Она обрезает дату до начала месяца, сохраняя тип timestamp. Например: SELECT date_trunc('month', '2025-10-05'::timestamp); вернёт 2025-10-01 00:00:00.
Для динамических расчётов с интервалами применяют оператор + interval или - interval. Чтобы получить первый день следующего месяца, используют комбинацию date_trunc и интервала: SELECT date_trunc('month', '2025-10-05'::date) + INTERVAL '1 month'; результатом будет 2025-11-01 00:00:00.
Если требуется работать с первым днём предыдущего месяца, достаточно вычесть интервал: SELECT date_trunc('month', '2025-10-05'::date) - INTERVAL '1 month'; Результат: 2025-09-01 00:00:00. Такой подход удобен при построении отчётов за предыдущий период.
При использовании агрегатных функций с группировкой по месяцам рекомендуется приводить даты к первому числу месяца через date_trunc('month', дата). Пример запроса: SELECT date_trunc('month', created_at) AS month_start, COUNT(*) FROM orders GROUP BY month_start ORDER BY month_start; Это обеспечивает точное суммирование записей по календарным месяцам.
Для фильтрации данных за конкретный месяц эффективнее использовать диапазон дат: WHERE created_at >= date_trunc('month', '2025-10-05') AND created_at < date_trunc('month', '2025-10-05') + INTERVAL '1 month'. Такой метод ускоряет выполнение запроса, так как позволяет PostgreSQL использовать индекс по дате.
При работе с временными интервалами важно учитывать тип данных. date хранит только календарный день, timestamp и timestamptz включают время и часовой пояс. Для точных расчётов первого дня месяца и интервалов рекомендуется приводить исходные данные к одному типу с помощью ::date или ::timestamp.
Примеры запросов для фильтрации по первому числу месяца
Для фильтрации записей по первому числу месяца в MySQL можно использовать функцию DATE_FORMAT. Например, чтобы выбрать все заказы с начала текущего месяца:
SELECT * FROM orders WHERE DATE_FORMAT(order_date, '%d') = '01';
В PostgreSQL эффективен подход с date_trunc. Для получения записей, созданных в первый день месяца:
SELECT * FROM orders WHERE order_date = date_trunc('month', order_date);
В SQL Server применяется функция DATEADD вместе с EOMONTH для точной фильтрации:
SELECT * FROM orders WHERE order_date = DATEADD(month, DATEDIFF(month, 0, order_date), 0);
Если необходимо выбрать первый день конкретного месяца, допустим марта 2025 года, в MySQL можно задать фиксированную дату:
SELECT * FROM orders WHERE order_date = '2025-03-01';
Для фильтрации по первому дню текущего месяца и дополнительному условию по статусу заказа в PostgreSQL:
SELECT * FROM orders WHERE order_date = date_trunc('month', CURRENT_DATE) AND status = 'Completed';
В SQL Server допустимо использовать комбинацию функций для динамического выбора первого числа месяца текущей даты:
SELECT * FROM orders WHERE order_date = DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0);
Вопрос-ответ:
Как получить первое число текущего месяца в SQL?
Для большинства СУБД можно использовать функции работы с датами. Например, в SQL Server это делается так: SELECT DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1). Эта команда возвращает дату с первым числом текущего месяца, при этом год и месяц берутся из текущей даты.
Можно ли получить первый день месяца для конкретной даты в PostgreSQL?
Да, в PostgreSQL удобно использовать функцию DATE_TRUNC. Пример: SELECT DATE_TRUNC('month', '2025-10-05'::date)::date;. Она обрежет дату до начала месяца, возвращая 2025-10-01. Этот метод работает для любых заданных дат.
Как извлечь первый день месяца в MySQL?
В MySQL можно использовать функцию DATE_FORMAT или LAST_DAY в комбинации с INTERVAL. Например: SELECT DATE_FORMAT(NOW(), '%Y-%m-01'); вернет первый день текущего месяца. Это простой способ получить нужную дату без сложных вычислений.
Есть ли разница между вычислением первого числа месяца в разных СУБД?
Да, разные системы используют свои функции для работы с датами. В SQL Server есть DATEFROMPARTS, в PostgreSQL — DATE_TRUNC, в MySQL — DATE_FORMAT. Синтаксис отличается, но идея одна: формирование даты с первым числом месяца. Нужно учитывать особенности СУБД при написании запросов.
Как сделать так, чтобы запрос всегда возвращал первое число месяца из любой даты в столбце таблицы?
Для этого нужно использовать функцию обрезки или форматирования даты, применяемую к столбцу. Например, в PostgreSQL: SELECT DATE_TRUNC('month', дата_столбца)::date FROM таблица;, а в SQL Server: SELECT DATEFROMPARTS(YEAR(дата_столбца), MONTH(дата_столбца), 1) FROM таблица;. Так каждая дата в столбце будет заменяться на первое число своего месяца.
Как в SQL получить первое число текущего месяца для использования в фильтрах WHERE?
Для определения первого числа текущего месяца в SQL часто используют функции работы с датами. Например, в PostgreSQL можно применить выражение date_trunc('month', current_date). Оно возвращает дату с обнулением дня и времени, то есть первое число месяца. В MySQL аналогично можно использовать DATE_FORMAT(CURDATE(), '%Y-%m-01'), которое формирует дату с первым днём текущего месяца. После этого результат можно использовать в условии WHERE, чтобы выбирать данные, начиная с первого числа месяца. Например: WHERE дата >= DATE_FORMAT(CURDATE(), '%Y-%m-01').
Можно ли получить первое число любого месяца, а не только текущего, если у меня есть дата в столбце таблицы?
Да, для этого тоже используют функции работы с датами, но с учетом значения из столбца. В PostgreSQL можно применить date_trunc('month', дата_столбца), чтобы получить первый день месяца для каждой даты. В MySQL используют DATE_FORMAT(дата_столбца, '%Y-%m-01'). Такой подход позволяет формировать запросы, которые группируют или фильтруют данные по началу месяца для любой даты, хранящейся в таблице. Это удобно, например, для аналитики продаж или подсчёта статистики по месяцам.
