
Работа с датами в SQL требует точного определения диапазонов для фильтрации и анализа данных. Диапазон дат может задаваться с помощью операторов BETWEEN … AND, >= и <=, а также функций преобразования строк в формат даты, таких как CAST и CONVERT. Например, выборка записей с 1 января 2025 года по 31 марта 2025 года выполняется через WHERE дата BETWEEN ‘2025-01-01’ AND ‘2025-03-31’.
При работе с временными данными важно учитывать точность типов данных: DATE хранит только дату, DATETIME и TIMESTAMP включают время. Для точной фильтрации по времени используется комбинация >= и < следующего дня, чтобы включить все события до конца выбранной даты, например: WHERE событие >= ‘2025-01-01 00:00:00’ AND событие < ‘2025-01-02 00:00:00’.
Использование функций SQL для работы с датами, таких как DATEADD, DATEDIFF и DATE_TRUNC, позволяет динамически формировать диапазоны. Это особенно полезно для отчётов за последние 7 дней, месяцы или кварталы. Например, запрос WHERE дата >= DATEADD(DAY, -7, GETDATE()) выбирает записи за последнюю неделю без ручного ввода конкретных дат.
Оптимизация запросов с диапазонами дат зависит от структуры индексов. Индекс по столбцу даты ускоряет выборку, особенно при больших таблицах. Использование функции на столбце в WHERE может приводить к полной проверке таблицы, поэтому предпочтительно применять фильтр напрямую к столбцу без обёрток функций.
Диапазон дат в SQL: как задать и использовать
Для задания диапазона дат в SQL применяют ключевое слово BETWEEN или условия с операторами сравнения. Например, чтобы выбрать записи с 1 января 2025 года по 31 марта 2025 года, используют:
SELECT * FROM orders WHERE order_date BETWEEN '2025-01-01' AND '2025-03-31';
Важно помнить, что BETWEEN включает границы диапазона. Для точного контроля времени используют тип DATETIME и уточняют время: '2025-03-31 23:59:59'.
Альтернативно применяют операторы >= и <= для более гибких условий. Пример:
SELECT * FROM orders WHERE order_date >= '2025-01-01' AND order_date <= '2025-03-31';
Для динамических диапазонов используют функции CURDATE() или NOW(). Например, выбор за последние 30 дней:
SELECT * FROM orders WHERE order_date >= CURDATE() - INTERVAL 30 DAY;
При работе с датами в разных форматах важно привести их к стандартному ISO 'YYYY-MM-DD'. Это исключает ошибки при сравнении и сортировке.
В случае анализа данных по месяцам или кварталам применяют функции YEAR() и MONTH(). Например, выбор всех заказов за февраль 2025 года:
SELECT * FROM orders WHERE YEAR(order_date) = 2025 AND MONTH(order_date) = 2;
Для индексации и оптимизации запросов рекомендуется хранить даты в формате DATE или DATETIME и избегать преобразований внутри условия WHERE, чтобы не блокировать использование индексов.
Если необходимо исключить крайние даты из диапазона, используют оператор > для начала и < для конца:
SELECT * FROM orders WHERE order_date > '2025-01-01' AND order_date < '2025-03-31';
Фильтрация записей по конкретным датам с помощью WHERE
Для выборки данных за определённый день используется оператор WHERE с точным указанием даты в формате 'YYYY-MM-DD'. Например, чтобы получить все заказы с 15 августа 2025 года в таблице orders:
SELECT * FROM orders WHERE order_date = '2025-08-15';
Если необходимо выбрать записи за несколько конкретных дат, применяют оператор IN:
SELECT * FROM orders WHERE order_date IN ('2025-08-15', '2025-08-16', '2025-08-18');
Для диапазона дат используют оператор BETWEEN, включающий граничные значения:
SELECT * FROM orders WHERE order_date BETWEEN '2025-08-15' AND '2025-08-20';
При работе с временными метками учитывайте точность: DATETIME включает часы, минуты и секунды, поэтому для выборки конкретного дня удобно использовать функцию DATE():
SELECT * FROM orders WHERE DATE(order_date) = '2025-08-15';
Для сложных условий допустимо комбинировать операторы =, IN и BETWEEN, а также использовать логические связки AND и OR для фильтрации по нескольким столбцам одновременно:
SELECT * FROM orders WHERE DATE(order_date) BETWEEN '2025-08-15' AND '2025-08-20' AND status = 'completed';
Обязательный момент – формат даты в запросе должен соответствовать типу данных столбца. Для DATE – 'YYYY-MM-DD', для DATETIME – 'YYYY-MM-DD HH:MM:SS'. Несоответствие формата приводит к пустым результатам.
Использование BETWEEN для ограничения диапазона дат
Оператор BETWEEN в SQL позволяет выбрать записи, где значение столбца находится в пределах указанного диапазона. Для работы с датами важно использовать формат, совместимый с типом данных столбца: DATE, DATETIME или TIMESTAMP.
Пример запроса для выборки заказов за определённый период:
SELECT * FROM orders WHERE order_date BETWEEN '2025-01-01' AND '2025-01-31';
В этом примере выбираются все записи с order_date начиная с 1 января 2025 года до 31 января 2025 года включительно. Важно, что BETWEEN включает обе границы диапазона.
Если столбец хранит дату и время, можно задать диапазон с точностью до времени:
SELECT * FROM orders WHERE order_date BETWEEN '2025-01-01 00:00:00' AND '2025-01-31 23:59:59';
Для динамического диапазона часто используют функции SQL, например, выбор данных за последние 7 дней:
SELECT * FROM orders WHERE order_date BETWEEN CURRENT_DATE - INTERVAL 7 DAY AND CURRENT_DATE;
При использовании BETWEEN с датами важно соблюдать последовательность: первая дата должна быть меньше или равна второй. Несоблюдение порядка приводит к пустому результату.
Для повышения читаемости запросов с датами рекомендуется использовать именованные параметры в подготовленных выражениях, например :start_date и :end_date, чтобы легко менять диапазон без изменения SQL-кода.
Сравнение дат с текущей датой через функции SQL

Для работы с датами в SQL часто требуется сравнивать значения с текущей датой. Основные функции для получения текущей даты зависят от СУБД: NOW() или CURRENT_TIMESTAMP в MySQL и PostgreSQL, GETDATE() в SQL Server, SYSDATE в Oracle. Эти функции возвращают дату и время сервера, что позволяет использовать их в фильтрах и условиях.
Примеры сравнения:
| СУБД | Задача | SQL-запрос |
|---|---|---|
| MySQL | Выбрать записи с датой позже текущей | SELECT * FROM orders WHERE order_date > NOW(); |
| PostgreSQL | Выбрать записи с датой до текущей | SELECT * FROM tasks WHERE due_date < CURRENT_DATE; |
| SQL Server | Выбрать записи с сегодняшней датой | SELECT * FROM events WHERE CAST(event_date AS DATE) = CAST(GETDATE() AS DATE); |
| Oracle | Выбрать записи с датой на неделю позже текущей | SELECT * FROM appointments WHERE appointment_date > SYSDATE + 7; |
Для точного сравнения по дате без времени используется приведение типа к формату даты. В MySQL можно использовать DATE(order_date) = CURDATE(), в PostgreSQL – DATE_TRUNC('day', date_column) = CURRENT_DATE. Это исключает влияние времени и корректно выбирает записи за конкретный день.
При фильтрации по диапазону относительно текущей даты удобно применять арифметические операции с датами: order_date BETWEEN NOW() - INTERVAL 30 DAY AND NOW() (MySQL) или order_date BETWEEN CURRENT_DATE - INTERVAL '30 days' AND CURRENT_DATE (PostgreSQL). Это позволяет быстро формировать отчеты за последние дни.
Рекомендация: всегда уточняйте, возвращает ли функция текущая дата с временем, и при необходимости используйте приведение типа, чтобы избежать непреднамеренного исключения записей.
Фильтрация данных по диапазону с временными метками
Для точного отбора записей в SQL используют оператор BETWEEN или комбинируют условия с >= и <=. Например, чтобы выбрать все заказы с 1 января 2025 по 31 января 2025, запрос будет выглядеть так:
SELECT * FROM orders WHERE order_date BETWEEN '2025-01-01' AND '2025-01-31';
Если требуется учитывать время, используйте формат YYYY-MM-DD HH:MI:SS. Для выборки заказов с 10:00 1 января по 18:00 5 января:
SELECT * FROM orders WHERE order_date >= '2025-01-01 10:00:00' AND order_date <= '2025-01-05 18:00:00';
Для динамических диапазонов применяют функции, например NOW() или CURRENT_DATE. Чтобы получить записи за последние 7 дней:
SELECT * FROM orders WHERE order_date >= NOW() - INTERVAL '7 DAYS';
При работе с временными метками важно учитывать часовой пояс базы данных. В PostgreSQL можно использовать AT TIME ZONE для приведения дат к нужному часовому поясу:
SELECT * FROM orders WHERE order_date AT TIME ZONE 'UTC' BETWEEN '2025-01-01 00:00:00' AND '2025-01-31 23:59:59';
Для ускорения фильтрации создавайте индекс по столбцу с временными метками. В MySQL это делается командой:
CREATE INDEX idx_order_date ON orders(order_date);
Использование индексов значительно сокращает время выполнения запросов при больших объёмах данных.
Обработка NULL в столбцах с датами при фильтрации
При работе с диапазонами дат в SQL важно учитывать наличие значений NULL в столбцах с датами. NULL обозначает отсутствие значения и не сравнивается с конкретными датами стандартными операторами, такими как =, <, >, BETWEEN. Без явной обработки NULL фильтры могут возвращать неполные результаты.
Для фильтрации с учетом NULL используют конструкцию IS NULL или комбинируют условия через OR. Например, чтобы выбрать все записи за январь 2025 года и при этом включить строки без даты:
SELECT * FROM orders WHERE (order_date BETWEEN '2025-01-01' AND '2025-01-31') OR order_date IS NULL;
Если требуется исключить NULL при фильтрации диапазона, достаточно использовать IS NOT NULL:
SELECT * FROM orders WHERE order_date IS NOT NULL AND order_date BETWEEN '2025-01-01' AND '2025-01-31';
При агрегировании данных наличие NULL может влиять на результаты. Например, MIN(order_date) и MAX(order_date) игнорируют NULL, тогда как COUNT(order_date) не учитывает их, в отличие от COUNT(*), который считает все строки.
Пример сравнения:
| Функция | Учет NULL | Пример |
|---|---|---|
| COUNT(order_date) | NULL не учитываются | 10 записей с датой из 12 |
| COUNT(*) | Все строки учитываются | 12 записей |
| MIN(order_date) | NULL игнорируются | ‘2025-01-05’ |
| MAX(order_date) | NULL игнорируются | ‘2025-01-28’ |
Для динамического диапазона дат с возможными NULL удобно использовать функции COALESCE или IFNULL для подстановки замещающих значений. Например, чтобы считать NULL как минимальную дату:
SELECT * FROM orders WHERE COALESCE(order_date, '1900-01-01') BETWEEN '2025-01-01' AND '2025-01-31';
Подводя итог, ключевые рекомендации при фильтрации столбцов с датами и NULL:
- Использовать
IS NULLиIS NOT NULLдля явной обработки отсутствующих значений. - Комбинировать диапазоны дат с условиями NULL через
OR, если нужно включить строки без даты. - Применять
COALESCEили аналогичные функции для подстановки замещающих дат. - Учитывать поведение агрегатных функций с NULL при расчетах диапазонов.
Сравнение дат с разными форматами в SQL
В SQL даты могут храниться в формате DATE, DATETIME или VARCHAR. Сравнение таких полей требует приведения их к единому формату. Например, строковые даты ‘2025-10-04’ и ‘04.10.2025’ напрямую сравнивать нельзя. Используйте функцию STR_TO_DATE в MySQL: STR_TO_DATE('04.10.2025', '%d.%m.%Y') для преобразования строки в дату.
Для SQL Server применяют CONVERT или CAST: CONVERT(DATE, '04.10.2025', 104) – формат 104 соответствует dd.mm.yyyy. После приведения типов можно использовать стандартные операторы сравнения =, <, >, BETWEEN.
При работе с DATETIME важно учитывать время. Сравнение с DATE требует обрезки времени: CAST(datetime_column AS DATE) = '2025-10-04'. Это предотвращает ошибки при фильтрации диапазонов.
Для выполнения диапазонного поиска между строковыми датами сначала преобразуйте обе стороны к типу DATE: WHERE STR_TO_DATE(start_date, '%d.%m.%Y') BETWEEN '2025-10-01' AND '2025-10-10'. В SQL Server аналогично: WHERE CAST(start_date AS DATE) BETWEEN '2025-10-01' AND '2025-10-10'.
Рекомендация: хранить даты в типах DATE или DATETIME. Если данные уже в строковом формате, выбирайте единый стандарт формата и применяйте функции преобразования перед сравнением. Это гарантирует корректность фильтров, сортировки и агрегатных функций.
Комбинирование нескольких условий даты в одном запросе
В SQL для фильтрации данных по нескольким условиям даты используют логические операторы AND и OR. Это позволяет формировать сложные выборки, учитывающие разные диапазоны и конкретные даты.
Пример использования нескольких условий для выборки записей за определённый месяц и одновременно после конкретной даты:
SELECT *
FROM orders
WHERE order_date BETWEEN '2025-09-01' AND '2025-09-30'
AND order_date > '2025-09-15';
Для объединения альтернативных диапазонов даты применяют оператор OR:
SELECT *
FROM orders
WHERE (order_date BETWEEN '2025-08-01' AND '2025-08-15')
OR (order_date BETWEEN '2025-09-01' AND '2025-09-15');
При сложных комбинациях условий удобно группировать их скобками:
- Сначала объединяются диапазоны с
OR. - Затем применяются дополнительные фильтры через
AND.
Пример запроса с фильтром по диапазону и конкретным дню недели:
SELECT *
FROM orders
WHERE (order_date BETWEEN '2025-09-01' AND '2025-09-30')
AND DAYOFWEEK(order_date) IN (2,3,4); -- Понедельник, вторник, среда
Рекомендации при комбинировании условий даты:
- Использовать скобки для явного порядка вычислений.
- Предпочитать
BETWEENдля диапазонов, чтобы избежать ошибок сравнения дат. - Оптимизировать индексами столбцы с датами, используемые в фильтрах.
- Избегать сложных функций в
WHERE, которые могут отключать индексы.
Правильное сочетание условий даты повышает точность выборки и производительность запросов. Тестируйте каждый диапазон отдельно, чтобы убедиться в корректности логики фильтрации.
Использование дат для агрегации и группировки данных

Для анализа данных по временным интервалам SQL предоставляет функции для группировки и агрегации на основе дат. Основной инструмент – оператор GROUP BY совместно с функциями преобразования дат.
Примеры функций, часто используемых для агрегации по датам:
DATE(date_column)– извлекает дату без времени.YEAR(date_column)– извлекает год.MONTH(date_column)– извлекает месяц.DAY(date_column)– извлекает день месяца.EXTRACT(unit FROM date_column)– универсальная функция для года, месяца, дня, недели, часа.
Пример группировки продаж по дням:
SELECT DATE(order_date) AS order_day,
SUM(amount) AS total_amount
FROM orders
GROUP BY DATE(order_date)
ORDER BY order_day;
Для ежемесячной агрегации удобно использовать комбинацию года и месяца:
SELECT YEAR(order_date) AS order_year,
MONTH(order_date) AS order_month,
COUNT(*) AS orders_count
FROM orders
GROUP BY YEAR(order_date), MONTH(order_date)
ORDER BY order_year, order_month;
SQL позволяет строить интервалы с помощью функций DATE_TRUNC (PostgreSQL) или TRUNC (Oracle), что упрощает группировку по неделям, кварталам или произвольным интервалам:
SELECT DATE_TRUNC('week', order_date) AS week_start,
SUM(amount) AS weekly_total
FROM orders
GROUP BY DATE_TRUNC('week', order_date)
ORDER BY week_start;
При работе с диапазонами дат для фильтрации перед агрегацией рекомендуется использовать оператор BETWEEN:
SELECT DATE(order_date) AS order_day,
SUM(amount) AS total_amount
FROM orders
WHERE order_date BETWEEN '2025-01-01' AND '2025-01-31'
GROUP BY DATE(order_date)
ORDER BY order_day;
Для ускорения запросов с группировкой по датам полезно создавать индексы по колонкам даты, особенно при больших таблицах.
Дополнительно можно комбинировать группировку с функциями CASE или FILTER для подсчета только определённых категорий данных в пределах временного интервала.
Вопрос-ответ:
Как задать диапазон дат в SQL для выборки записей за определённый период?
В SQL для фильтрации данных по дате можно использовать условие WHERE с операторами сравнения. Например, если нужно выбрать записи между 1 января 2025 года и 31 марта 2025 года, можно написать: WHERE дата >= '2025-01-01' AND дата <= '2025-03-31'. Важно учитывать формат даты, который поддерживает ваша база данных, и проверять корректность включения граничных значений.
Можно ли использовать функции для работы с диапазонами дат в SQL?
Да, многие СУБД предоставляют функции для работы с датами. Например, в MySQL есть DATE(), DATE_ADD(), DATEDIFF(). Они помогают получать значения дат, вычислять разницу между ними или смещать даты на определённое количество дней, месяцев или лет. Это удобно для формирования динамических диапазонов дат в запросах.
Как выбрать записи за последние 7 дней с использованием SQL?
Для выборки данных за последние 7 дней можно использовать текущую дату и оператор BETWEEN. Например, в PostgreSQL: WHERE дата BETWEEN CURRENT_DATE - INTERVAL '7 days' AND CURRENT_DATE. Такой подход позволяет автоматически подставлять диапазон относительно сегодняшнего числа без ручного ввода дат.
Есть ли разница между использованием BETWEEN и двумя условиями с операторами >= и <=?
Функционально оба способа дают одинаковый результат: BETWEEN '2025-01-01' AND '2025-03-31' эквивалентно >= '2025-01-01' AND <= '2025-03-31'. Разница в синтаксисе и читаемости. BETWEEN воспринимается как более компактный способ задать диапазон, но при работе с датами и временем следует помнить, что верхняя граница включается, что иногда приводит к пропуску записей с временем позднее 00:00 верхнего дня.
Как фильтровать записи по дате и времени в одной колонке?
Если колонка содержит дату и время, важно учитывать точное значение времени при фильтрации. Например, для выборки всех записей 15 марта 2025 года в MySQL можно использовать: WHERE дата >= '2025-03-15 00:00:00' AND дата < '2025-03-16 00:00:00'. Такой подход гарантирует, что попадут все записи с любым временем внутри указанного дня.
