Решение проблемы SQL: включение диапазона дат в BETWEEN

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

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

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

Если необходимо исключить крайние значения диапазона из SQL-запроса, следует использовать операторы > и <, а не BETWEEN. Например, если вы хотите исключить даты '2021-01-01' и '2021-01-31', ваш запрос должен выглядеть так:

SQL
Скопировать код
SELECT * FROM ваша_таблица WHERE дата > '2021-01-01' AND дата < '2021-01-31';

Такой запрос вернёт ряды, в которых значения даты лежат внутри заданного интервала, но не включают его границы.

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

Обзор: Детали работы с датами важны

Учёт времени при работе с датами

В SQL тип данных datetime интерпретирует значения в формате 'YYYY-MM-DD' как 'YYYY-MM-DD 00:00:00'. Если же вы хотите включить все события дня '2021-01-31', ваш запрос должен устанавливать конечную дату как меньше следующего дня:

SQL
Скопировать код
-- Последняя минута дня '2021-01-31'!
SELECT * FROM ваша_таблица WHERE created_at >= '2021-01-01' AND created_at < DATEADD(day, 1, '2021-01-31');

Фильтр по дате в столбце datetime

При работе с полями типа datetime удобно использовать приведение типов с помощью функции CAST для фильтрации по определённой дате:

SQL
Скопировать код
-- Время отбрасываем, дату сохраняем!
SELECT * FROM ваша_таблица WHERE CAST(created_at AS date) BETWEEN '2021-01-01' AND '2021-01-01';

Объявление переменных до использования

Корректное применение функций, вроде DATEDIFF, подразумевает предварительное объявление переменных:

SQL
Скопировать код
-- Мы заранее знаем наши даты!
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-запросов с несколькими условиями рекомендуется использование скобок:

SQL
Скопировать код
-- Организация – залог успеха!
SELECT * FROM ваша_таблица WHERE (created_at >= '2021-01-01') AND (created_at < DATEADD(day, 1, '2021-01-31'));

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

Можно представить оператор BETWEEN как охват границ:

Markdown
Скопировать код
- Гости, прибывшие в период `BETWEEN` 22:00 🕙 и 02:00 🕑, допускаются к входу.
SQL
Скопировать код
-- Кто последний пришёл на вечеринку?
SELECT * FROM празднующие WHERE время_прихода BETWEEN '22:00' AND '02:00';

Однако, при использовании операторов > и <, которые исключают крайние значения, и 22:00 🕙, и 02:00 🕑 не попадают в этот интервал:

Markdown
Скопировать код
🚪[22:01, 01:59]🚪
SQL
Скопировать код
-- Добро пожаловать, всем, кто прибыл строго не вовремя!
SELECT * FROM празднующие WHERE время_прихода > '22:00' AND время_прихода < '02:00';

Погружение в детали: нюансы сравнения дат

Использование функции DATE

Функция DATE позволяет получать данные по конкретной дате, исключая время:

SQL
Скопировать код
-- Сбор информации за определённый день!
SELECT * FROM ваша_таблица WHERE DATE(created_at) = '2021-01-01';

Соблюдение формата дат

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

SQL
Скопировать код
-- Даты должны быть настроены на одну волну!
SELECT * FROM ваша_таблица WHERE created_at >= '2021-01-01'

Уточнение временных промежутков

Точное определение временных интервалов позволяет избежать ошибок, вызванных минутными отклонениями:

SQL
Скопировать код
-- Всё по плану, без опозданий!
SELECT * FROM ваша_таблица WHERE created_at >= '2021-01-01 00:00:00' AND created_at < '2021-02-01 00:00:00';

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

  1. BETWEEN (Transact-SQL) – SQL Server | Microsoft Learn — официальная документация Microsoft по оператору SQL BETWEEN.
  2. SQL BETWEEN | Basic SQL – Mode — вводное руководство, иллюстрирующее диапазоны с помощью BETWEEN.
  3. IBM Documentation — много информации для понимания BETWEEN и других SQL-предикатов в СУБД DB2 от IBM.
  4. ms sql2000 arabic problem – Stack Overflow — обсуждение, сравнивающее BETWEEN с операторами >= и <= в SQL Server.
  5. Problems due to use of BETWEEN – avoid BETWEEN | SqlHints.com — статья, подчёркивающая частые ошибки при использовании BETWEEN и причины, по которым следует избегать этого оператора.