Выборка записей за последний месяц в SQL Server
Быстрый ответ
Для извлечения данных за предыдущий месяц мы используем функцию EOMONTH, которая помогает нам определить начало и конец заинтересовавшего нас периода:
SELECT *
FROM TableName
WHERE DateColumn >= DATEADD(MONTH, -1, DATEADD(DAY, 1, EOMONTH(GETDATE(), -2)))
AND DateColumn < DATEADD(DAY, 1, EOMONTH(GETDATE(), -1));
Важно корректно применять операторы >=
и <
для включения начала интервала и исключения его конца. Это обеспечивает точное определение диапазона дат.
Улучшение производительности запроса
Чтобы усовершенствовать производительность запроса, стоит вынести вычисление даты из условия WHERE. Это позволяет оптимальнее использовать индексы, улучшая тем самым производительность:
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;
Применение переменных для дат помогает избежать лишних вычислений, оптимизируя процесс.
Динамический расчёт диапазона
Сложности, связанные с високосными годами и различной продолжительностью месяцев, можно устранить за счёт детального расчёта диапазона:
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
необходимо быть особенно осторожным, так как это может охватить больше дат, чем вы планировали. Явное определение границ с использованием >=
и <
– залог получения корректных результатов.
Визуализация
Представим, что вы путешественник во времени:
Текущий месяц: 📅 (Июль)
Архив за прошлый месяц: 🗂️ (Июнь)
Используя SQL, вы можете перенестись на месяц назад и исследовать все записи:
SELECT *
FROM HistoryLogs
WHERE LogDate >= '2022-06-01' AND LogDate < '2022-07-01';
Путь путешественника: 📅 ➡️ 🗂️
Записи, собранные за июнь: 📜📜📜
Выше приведён пример наглядного представления процесса извлечения данных за предыдущий месяц.
Использование EOMONTH для выборки дат
Функция EOMONTH
полезна для точного определения последнего дня месяца, облегчая таким образом определение начала и конца месяца:
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, чтобы не снижать их эффективность.
Решения для особых случаев
Получение данных за предыдущий месяц может быть усложнено, например, если сейчас январь. В таких случаях требуется учитывать год:
SELECT *
FROM FinancialRecords
WHERE YEAR(DateTransaction) = YEAR(DATEADD(MONTH, -1, GETDATE()))
AND MONTH(DateTransaction) = MONTH(DATEADD(MONTH, -1, GETDATE()));
Такой запрос гарантирует нахождение нужных данных с учетом и месяца, и года.
Полезные материалы
- Функция GETDATE() в SQL Server — пошаговое объяснение работы с текущими датой и временем.
- EOMONTH (Transact-SQL) — подробное описание функции поиска концов месяцев.
- Функция DATEADD в SQL Server — руководство по управлению датами с помощью DATEADD.
- BETWEEN в SQL Server — советы по использованию условия BETWEEN.
- Динамическая маскировка данных в SQL Server 2016 — примеры защиты конфиденциальных данных при использовании динамических запросов по датам.