Решение проблемы SQL: включение диапазона дат в BETWEEN
Быстрый ответ
Если необходимо исключить крайние значения диапазона из SQL-запроса, следует использовать операторы >
и <
, а не BETWEEN
. Например, если вы хотите исключить даты '2021-01-01' и '2021-01-31', ваш запрос должен выглядеть так:
SELECT * FROM ваша_таблица WHERE дата > '2021-01-01' AND дата < '2021-01-31';
Такой запрос вернёт ряды, в которых значения даты лежат внутри заданного интервала, но не включают его границы.
Обзор: Детали работы с датами важны
Учёт времени при работе с датами
В SQL тип данных datetime
интерпретирует значения в формате 'YYYY-MM-DD'
как 'YYYY-MM-DD 00:00:00'
. Если же вы хотите включить все события дня '2021-01-31', ваш запрос должен устанавливать конечную дату как меньше следующего дня:
-- Последняя минута дня '2021-01-31'!
SELECT * FROM ваша_таблица WHERE created_at >= '2021-01-01' AND created_at < DATEADD(day, 1, '2021-01-31');
Фильтр по дате в столбце datetime
При работе с полями типа datetime удобно использовать приведение типов с помощью функции CAST
для фильтрации по определённой дате:
-- Время отбрасываем, дату сохраняем!
SELECT * FROM ваша_таблица WHERE CAST(created_at AS date) BETWEEN '2021-01-01' AND '2021-01-01';
Объявление переменных до использования
Корректное применение функций, вроде DATEDIFF
, подразумевает предварительное объявление переменных:
-- Мы заранее знаем наши даты!
DECLARE @StartDate DATE = '2021-01-01', @EndDate DATE = '2021-01-31';
SELECT * FROM ваша_таблица WHERE created_at >= @StartDate AND created_at < DATEADD(day, 1, @EndDate);
Скобки для улучшения читаемости
Для более удобного чтения сложных SQL-запросов с несколькими условиями рекомендуется использование скобок:
-- Организация – залог успеха!
SELECT * FROM ваша_таблица WHERE (created_at >= '2021-01-01') AND (created_at < DATEADD(day, 1, '2021-01-31'));
Визуализация
Можно представить оператор BETWEEN
как охват границ:
- Гости, прибывшие в период `BETWEEN` 22:00 🕙 и 02:00 🕑, допускаются к входу.
-- Кто последний пришёл на вечеринку?
SELECT * FROM празднующие WHERE время_прихода BETWEEN '22:00' AND '02:00';
Однако, при использовании операторов >
и <
, которые исключают крайние значения, и 22:00 🕙, и 02:00 🕑 не попадают в этот интервал:
🚪[22:01, 01:59]🚪
-- Добро пожаловать, всем, кто прибыл строго не вовремя!
SELECT * FROM празднующие WHERE время_прихода > '22:00' AND время_прихода < '02:00';
Погружение в детали: нюансы сравнения дат
Использование функции DATE
Функция DATE
позволяет получать данные по конкретной дате, исключая время:
-- Сбор информации за определённый день!
SELECT * FROM ваша_таблица WHERE DATE(created_at) = '2021-01-01';
Соблюдение формата дат
Важно учесть, чтобы формат даты в запросе соответствовал формату, используемому в базе данных, чтобы исключить ненужные проблемы:
-- Даты должны быть настроены на одну волну!
SELECT * FROM ваша_таблица WHERE created_at >= '2021-01-01'
Уточнение временных промежутков
Точное определение временных интервалов позволяет избежать ошибок, вызванных минутными отклонениями:
-- Всё по плану, без опозданий!
SELECT * FROM ваша_таблица WHERE created_at >= '2021-01-01 00:00:00' AND created_at < '2021-02-01 00:00:00';
Полезные материалы
- BETWEEN (Transact-SQL) – SQL Server | Microsoft Learn — официальная документация Microsoft по оператору SQL BETWEEN.
- SQL BETWEEN | Basic SQL – Mode — вводное руководство, иллюстрирующее диапазоны с помощью
BETWEEN
. - IBM Documentation — много информации для понимания BETWEEN и других SQL-предикатов в СУБД DB2 от IBM.
- ms sql2000 arabic problem – Stack Overflow — обсуждение, сравнивающее BETWEEN с операторами
>=
и<=
в SQL Server. - Problems due to use of BETWEEN – avoid BETWEEN | SqlHints.com — статья, подчёркивающая частые ошибки при использовании BETWEEN и причины, по которым следует избегать этого оператора.