Выборка записей по месяцу и году в SQL: учёт високосных годов

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

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

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

Если в интересующем вас столбце есть данные типа дата, вы можете использовать функции MONTH() и YEAR(), чтобы отобрать записи за конкретный месяц и год:

SQL
Скопировать код
SELECT * FROM your_table
WHERE MONTH(your_date_column) = 3 AND YEAR(your_date_column) = 2023;

В примере замените your_table и your_date_column на актуальные названия таблицы и столбца с датой, чтобы отфильтровать записи за март 2023 года.

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

Работа с функциями MONTH и YEAR

Функции MONTH() и YEAR() доступны в SQL для извлечения месяца и года из даты, что позволяет отфильтровать данные по конкретным месяцу и году. Однако стоит запомнить: при обработке больших объёмов данных производительность может снижаться, поскольку функции обходят индексацию столбцов.

С учётом разной длительности месяцев

Так как продолжительность месяца нередко меняется, можно использовать диапазоны дат с операторами >= и <. В большинстве случаев достаточно выбрать корректные даты:

SQL
Скопировать код
SELECT * FROM your_table
WHERE your_date_column >= '2023-03-01'
AND your_date_column < '2023-04-01';

Этот интервал включает все дни марта 2023 года, не зависимо от их количества.

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

Основная сложность использования функций в условии WHERE заключается в том, что они обходят индексацию, как в случае с MONTH() и YEAR(). Чтобы оптимизировать запросы:

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

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

Представьте, что ваши данные — это океан, а вы ловите в нём рыбу, используя вашу специализированную сеть (условие WHERE), предназначенную только для добычи рыбы (записей) из марта 2023 года:

Markdown
Скопировать код
     📅
🎣🔍[`2023-03-%`]🐟🐟🐟
SQL
Скопировать код
SELECT * FROM `records`
WHERE MONTH(record_date) = 3
AND YEAR(record_date) = 2023;

Выбросьте SQL-сеть и, вот оно, вы словили все записи за март!

Учёт високосных годов и продолжительности месяцев

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

SQL
Скопировать код
SELECT * FROM your_table
WHERE your_date_column >= '2023-02-01'
AND your_date_column < DATEADD(day, 1, EOMONTH('2023-02-01'));

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

Трюк с использованием хранимой процедуры

Хранимая процедура с параметрами облегчает работу и делает выборку более гибкой:

SQL
Скопировать код
CREATE PROCEDURE GetRecordsByMonthYear
    @Month INT,
    @Year INT
AS BEGIN
    DECLARE @StartDate DATE = CONCAT(@Year, '-', @Month, '-01'); -- 'ГГГГ-ММ-01'
    DECLARE @EndDate DATE = DATEADD(month, 1, @StartDate); -- первый день следующего месяца

    SELECT *
    FROM your_table
    WHERE your_date_column >= @StartDate
    AND your_date_column < @EndDate;
END;

Теперь получить отчёт можно очень просто: EXEC GetRecordsByMonthYear 3, 2023;. Это действительно удобно!

Совместимость с разными БД

Если вам требуется универсальный подход и функции MONTH() и YEAR() недоступны, можно использовать TO_CHAR:

SQL
Скопировать код
SELECT TO_CHAR(your_date_column, 'YYYY-MM') FROM your_table
WHERE TO_CHAR(your_date_column, 'YYYY-MM') = '2023-03';

Этот метод подойдёт для работы с такими базами данных, как PostgreSQL.

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

  1. Как вернуть только дату из типа данных Datetime в SQL Server – Stack Overflow — рекомендации по извлечению и сравнению только даты.
  2. Клауза WHERE в SQL – Tutorial Republic — как использовать операторы SQL для фильтрации запросов.
  3. Преобразования даты и времени с использованием SQL Server – MSSQLTips — разбор преобразований даты и времени для составления запросов к базе данных по месяцам.
  4. Временные таблицы в SQL Server – Simple Talk — почему и как стоит использовать временные таблицы при формировании сложных запросов с использованием дат.