Выборка записей за последние 90 дней в SQL: примеры для MySQL, SQL Server и PostgreSQL

Работа с датой и временем — одна из самых частых задач при разработке баз данных и анализе информации. Разработчикам и аналитикам регулярно требуется получить данные за определенный период, например, за последний квартал (90 дней). В этой статье мы подробно разберем, как правильно составлять SQL-запросы для выборки записей за последние 90 дней в различных популярных СУБД.

Основные подходы к выборке по дате

Существует два основных подхода к получению данных за временной интервал:

  • Использование встроенных функций СУБД — таких как NOW, GETDATE, в комбинации с функциями добавления/вычитания интервалов (например, INTERVAL 90 DAY или DATEADD). Это самый удобный и динамичный способ, так как запрос сам высчитывает нужную дату на момент выполнения.
  • Использование оператора BETWEEN — позволяет задать жесткие границы диапазона дат. Подходит, если вам нужно получить данные строго между двумя конкретными датами, но для динамического вычисления «от сегодня и назад» он менее удобен.

Выборка за последние 90 дней в MySQL

В MySQL для работы с текущей датой и временем используется функция NOW или CURDATE. Чтобы отнять от текущей даты 90 дней, применяется конструкция INTERVAL.

Пример запроса:

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

SELECT * FROM orders WHERE created_at >= NOW ౼ INTERVAL 90 DAY;

Если вам нужны данные только по дате (без учета времени), можно использовать CURDATE:

SELECT * FROM orders WHERE DATE(created_at) >= CURDATE — INTERVAL 90 DAY;

Важное замечание по производительности: Использование функции DATE(created_at) в условии WHERE может привести к полному перебору записей (full table scan), так как индексы по столбцу с датой могут не работать при обертывании столбца в функцию. Поэтому предпочтительнее первый вариант, где мы сравниваем исходный столбец с вычисленным значением.

Выборка за последние 90 дней в SQL Server (T-SQL)

В Microsoft SQL Server для получения текущей даты и времени используется функция GETDATE. Для вычитания интервала применяется функция DATEADD.

Синтаксис функции DATEADD:

DATEADD(datepart, number, date)

Где datepart — это часть даты (в нашем случае day или dd), number — количество (90), date — исходная дата.

SELECT * FROM orders WHERE created_at >= DATEADD(day, -90, GETDATE);

Этот запрос вернет все записи из таблицы orders, которые были добавлены за последние 90 дней от момента выполнения запроса.

Выборка за последние 90 дней в PostgreSQL

В PostgreSQL также можно использовать стандартный SQL-синтаксис с интервалами. Для получения текущего времени используется CURRENT_TIMESTAMP или NOW.

SELECT * FROM orders WHERE created_at >= NOW ౼ INTERVAL ’90 days’;

PostgreSQL отлично работает с интервалами, и такой запрос будет оптимизирован правильно, если по полю created_at построен индекс.

Использование оператора BETWEEN

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

Пример с BETWEEN в MySQL:

SELECT * FROM orders WHERE created_at BETWEEN CURDATE ౼ INTERVAL 90 DAY AND NOW;

Этот способ подходит, когда нужно явно задать обе границы диапазона.

Альтернативный метод: использование DATEDIFF

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

Пример (SQL Server):

SELECT * FROM orders WHERE DATEDIFF(day, created_at, GETDATE) <= 90;

Минус этого подхода: Как и в случае с DATE в MySQL, использование DATEDIFF в условии WHERE слева от оператора сравнения может нарушить работу индексов (SARGability), что приведет к сканированию всей таблицы. Для таблиц с миллионами записей это критично. Используйте этот метод только на небольших таблицах или если производительность не является приоритетом.

Лучшие практики работы с датами в SQL

  1. Храните дату и время вместе. Разделение даты и времени на разные столбцы, это плохая архитектура. Лучше использовать один столбец типа DATETIME или TIMESTAMP.
  2. Не оборачивайте индексированные столбцы в функции. Сравнения вида WHERE DATE(date_col) >= ... или WHERE DATEDIFF(;..) <= ..; игнорируют индексы. Сравнивайте сам столбец с вычисленным значением: WHERE date_col >= [вычисленная_дата].
  3. Учитывайте часовые пояса. Если ваше приложение работает с пользователями из разных часовых поясов, убедитесь, что вы храните даты в UTC, а при выборке конвертируете их в нужный пояс.
  4. Создавайте индексы. Если вы часто делаете выборки по дате за последние N дней, обязательно создайте индекс по столбцу с датой создания записи.

Выборка записей за последние 90 дней в SQL — простая задача, если знать функции конкретной СУБД. Для MySQL используйте NOW ౼ INTERVAL 90 DAY, для SQL Server — DATEADD(day, -90, GETDATE), а для PostgreSQL — NOW — INTERVAL '90 days'. Соблюдая правила индексации и избегая оборачивания столбцов в функции внутри WHERE, вы обеспечите высокую скорость выполнения ваших запросов даже на больших объемах данных.