Выборка записей за последний месяц в SQL Server

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

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

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

Для извлечения данных за предыдущий месяц мы используем функцию EOMONTH, которая помогает нам определить начало и конец заинтересовавшего нас периода:

SQL
Скопировать код
SELECT *
FROM TableName
WHERE DateColumn >= DATEADD(MONTH, -1, DATEADD(DAY, 1, EOMONTH(GETDATE(), -2)))
AND DateColumn < DATEADD(DAY, 1, EOMONTH(GETDATE(), -1));

Важно корректно применять операторы >= и < для включения начала интервала и исключения его конца. Это обеспечивает точное определение диапазона дат.

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

Улучшение производительности запроса

Чтобы усовершенствовать производительность запроса, стоит вынести вычисление даты из условия WHERE. Это позволяет оптимальнее использовать индексы, улучшая тем самым производительность:

SQL
Скопировать код
DECLARE @StartDate DATE = DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) – 1, 0);
DECLARE @EndDate DATE = DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0));

SELECT *
FROM YourTable
WHERE DateCreated >= @StartDate AND DateCreated < @EndDate;

Применение переменных для дат помогает избежать лишних вычислений, оптимизируя процесс.

Динамический расчёт диапазона

Сложности, связанные с високосными годами и различной продолжительностью месяцев, можно устранить за счёт детального расчёта диапазона:

SQL
Скопировать код
DECLARE @StartOfCurrentMonth DATE = DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0);
DECLARE @EndOfPreviousMonth DATE = DATEADD(DAY, -1, @StartOfCurrentMonth);

SELECT *
FROM YourTable
WHERE DateCreated >= DATEADD(MONTH, -1, @StartOfCurrentMonth)
AND DateCreated < @StartOfCurrentMonth;

Такой подход учитывает все возможные особенности календаря и помогает избежать ошибок при выборке данных.

Точное определение границ

При использовании BETWEEN необходимо быть особенно осторожным, так как это может охватить больше дат, чем вы планировали. Явное определение границ с использованием >= и < – залог получения корректных результатов.

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

Представим, что вы путешественник во времени:

Markdown
Скопировать код
Текущий месяц: 📅 (Июль)
Архив за прошлый месяц: 🗂️ (Июнь)

Используя SQL, вы можете перенестись на месяц назад и исследовать все записи:

SQL
Скопировать код
SELECT *
FROM HistoryLogs
WHERE LogDate >= '2022-06-01' AND LogDate < '2022-07-01';
Markdown
Скопировать код
Путь путешественника: 📅 ➡️ 🗂️
Записи, собранные за июнь: 📜📜📜

Выше приведён пример наглядного представления процесса извлечения данных за предыдущий месяц.

Использование EOMONTH для выборки дат

Функция EOMONTH полезна для точного определения последнего дня месяца, облегчая таким образом определение начала и конца месяца:

SQL
Скопировать код
DECLARE @LastDayOfPreviousMonth DATE = EOMONTH(GETDATE(), -1);
DECLARE @FirstDayOfPreviousMonth DATE = DATEADD(DAY, 1, EOMONTH(GETDATE(), -2));

SELECT *
FROM EventTable
WHERE EventDate >= @FirstDayOfPreviousMonth AND EventDate <= @LastDayOfPreviousMonth;

Этот подход позволяет точно задать временные рамки без необходимости вручную производить сложные расчёты.

Эффективное использование индексов

Индексы могут значительно ускорить поиск данных, особенно при работе с большими объемами информации. Не рекомендуется оборачивать колонку даты функциями в условии WHERE, чтобы не снижать их эффективность.

Решения для особых случаев

Получение данных за предыдущий месяц может быть усложнено, например, если сейчас январь. В таких случаях требуется учитывать год:

SQL
Скопировать код
SELECT *
FROM FinancialRecords
WHERE YEAR(DateTransaction) = YEAR(DATEADD(MONTH, -1, GETDATE()))
AND MONTH(DateTransaction) = MONTH(DATEADD(MONTH, -1, GETDATE()));

Такой запрос гарантирует нахождение нужных данных с учетом и месяца, и года.

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

  1. Функция GETDATE() в SQL Server — пошаговое объяснение работы с текущими датой и временем.
  2. EOMONTH (Transact-SQL) — подробное описание функции поиска концов месяцев.
  3. Функция DATEADD в SQL Server — руководство по управлению датами с помощью DATEADD.
  4. BETWEEN в SQL Server — советы по использованию условия BETWEEN.
  5. Динамическая маскировка данных в SQL Server 2016 — примеры защиты конфиденциальных данных при использовании динамических запросов по датам.