Работа с датой и временем — одна из самых частых задач при разработке баз данных и анализе информации. Разработчикам и аналитикам регулярно требуется получить данные за определенный период, например, за последний квартал (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
- Храните дату и время вместе. Разделение даты и времени на разные столбцы, это плохая архитектура. Лучше использовать один столбец типа
DATETIMEилиTIMESTAMP. - Не оборачивайте индексированные столбцы в функции. Сравнения вида
WHERE DATE(date_col) >= ...илиWHERE DATEDIFF(;..) <= ..;игнорируют индексы. Сравнивайте сам столбец с вычисленным значением:WHERE date_col >= [вычисленная_дата]. - Учитывайте часовые пояса. Если ваше приложение работает с пользователями из разных часовых поясов, убедитесь, что вы храните даты в UTC, а при выборке конвертируете их в нужный пояс.
- Создавайте индексы. Если вы часто делаете выборки по дате за последние N дней, обязательно создайте индекс по столбцу с датой создания записи.
Выборка записей за последние 90 дней в SQL — простая задача, если знать функции конкретной СУБД. Для MySQL используйте NOW ౼ INTERVAL 90 DAY, для SQL Server — DATEADD(day, -90, GETDATE), а для PostgreSQL — NOW — INTERVAL '90 days'. Соблюдая правила индексации и избегая оборачивания столбцов в функции внутри WHERE, вы обеспечите высокую скорость выполнения ваших запросов даже на больших объемах данных.