Блог веб-разработчика
О разработке веб-приложений на Symfony
MySQL: cравнение даты (datetime) через оператор BETWEEN
Оператор BETWEEN идеально подходит для сравнения диапазона между датами (datetime). Но тут есть подводные камни. Например, есть задача — выбрать данные из таблицы за некоторый промежуток времени (с ‘2008-08-14’ по ‘2008-08-23’).
Рекомендации:
1. Выполняя любые сравнения, приводить все данные к одному типу.
2. Если один операнд имеет значение типа TIMESTAMP или DATETIME, а другой является константой, операнды сравниваются как значения типа TIMESTAMP. А это значит, что если была строка в виде ‘2008-08-14’, то она автоматически преобразуется в TIMESTAMP ‘2008-08-14 00:00:00’ и это влияет на результат запроса.
3. Над данными, которые участвуют в условиях сравнения желательно не делать никаких операций — это позволяет для них использовать индексы, иначе они игнорируются.
Примеры запросов с BETWEEN и без него:
Получаем самый лучший запрос:
9 Responses to “MySQL: cравнение даты (datetime) через оператор BETWEEN”
автору респект.
Очень доходчиво
А в случае если дату брать как TIMESTAMP, по идее индексы должны работать
SELECT * FROM `ps_feed` WHERE created_at BETWEEN TIMESTAMP(‘2009-08-20’) AND TIMESTAMP(‘2009-08-27’)
«Самый лучший» у меня запрос не работает. Но за то прекрасно работает
SELECT * FROM news WHERE calldate BETWEEN ‘2009-09-03%’ AND ‘2009-09-08%’
где calldate — типа datetime
SELECT * FROM news WHERE DATE(calldate) BETWEEN ‘2009-09-03’ AND ‘2009-09-08’
[…] MySQL: cравнение даты (datetime) через оператор BETWEEN […]
Автору — спасибо.
Кратко, чётко и без «писательских соплей». 8)
Больше бы таких статей в интернете.
Спасибо автору!
Как раз то, что я искал)!
В 4-м варианте мы явно приводим данные к нужному типу — и сюрпризов в этом случае не будет. 3-й вариант тоже будет работать. Стоит всегда проверять запросы с помощью EXPLAIN — и выбирать лучший запрос.
Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite
Базы данных
SQL условие BETWEEN
В этом учебном материале вы узнаете, как использовать SQL условие BETWEEN с синтаксисом и примерами.
Описание
SQL условие BETWEEN позволяет легко проверить, находится ли выражение в диапазоне значений (включительно). Его можно использовать в операторе SELECT, INSERT, UPDATE или DELETE.
Синтаксис
Синтаксис для условия BETWEEN в SQL:
Параметры или аргументы
Примечание
Условие SQL BETWEEN будет возвращать записи, где выражение находится в диапазоне значений value1 и value2 (включительно).
Давайте рассмотрим пример использования условия BETWEEN для получения значений в числовом диапазоне.
В этом примере у нас есть таблица suppliers со следующими данными:
supplier_id | supplier_name | city | state |
---|---|---|---|
100 | Yandex | Moscow | Moscow |
200 | Lansing | Michigan | |
300 | Oracle | Redwood City | California |
400 | Bing | Redmond | Washington |
500 | Yahoo | Sunnyvale | Washington |
600 | DuckDuckGo | Paoli | Pennsylvania |
700 | Qwant | Paris | Ile de France |
800 | Menlo Park | California | |
900 | Electronic Arts | San Francisco | California |
Выполните следующий оператор SELECT:
Будет выбрано 4 записи. Вот результаты, которые вы должны получить:
supplier_id | supplier_name | city | state |
---|---|---|---|
300 | Oracle | Redwood City | California |
400 | Bing | Redmond | Washington |
500 | Yahoo | Sunnyvale | Washington |
600 | DuckDuckGo | Paoli | Pennsylvania |
Даты могут быть несколько сложными в SQL, и то, как вы используете условие BETWEEN с датами, зависит от базы данных, которую вы используете (т.е. Oracle, SQL Server, MySQL и т.д.). Мы покажем вам пример для каждой из основных технологий баз данных. Итак, начнем.
В этом примере у нас есть таблица orders и следующими данными:
order_id | customer_id | order_date |
---|---|---|
1 | 7000 | 2019/06/18 |
2 | 5000 | 2019/06/18 |
3 | 8000 | 2019/06/19 |
4 | 4000 | 2019/06/20 |
5 | NULL | 2019/07/01 |
Введите один из следующих операторов SQL, в зависимости от базы данных, которую вы используете.
Для SQL Server, PostgreSQL и SQLite:
Для Oracle (используйте функцию TO_DATE):
Для MySQL и MariaDB (используйте функцию CAST):
Будет выбрано 3 записи. Вот результаты, которые вы получите:
order_id | customer_id | order_date |
---|---|---|
3 | 8000 | 2019/06/19 |
4 | 4000 | 2019/06/20 |
5 | NULL | 2019/07/01 |
Условие BETWEEN может использоваться с оператором NOT для создания условия NOT BETWEEN. Давайте рассмотрим пример, который показывает, как использовать условие NOT BETWEEN в запросе.
В этом примере у нас есть таблица customer, содержащая следующие данные:
С помощью предиката SQL BETWEEN можно извлечь из таблицы строки, в которых значения некоторого проверяемого столбца находятся в интервале, границы которого обозначены некоторым выражением. Границы интервала также включены в него.
Запросы с предикатом SQL BETWEEN имеют следующий синтаксис:
Если перед предикатом BETWEEN поставить ключевое слово NOT, то в выборку попадут строки, в которых значение проверяемого столбца находится за пределами интервала: до ВЫРАЖЕНИЯ_1 и после ВЫРАЖЕНИЯ_2.
Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке .
Запросы с BETWEEN: интервал задан указанными числами
В самых простых запросах с предикатом BETWEEN границы интервала для проверяемого столбца заданы непосредственным указанием числовых значений.
Пример 1. Итак, работаем с базой данных фирмы и её таблицей Staff, содержащей данные о заработной плате сотрудников.
ID | Name | Salary |
1 | Sanders | 18357.5 |
2 | Pernal | 15430.0 |
3 | Marenghi | 17506.8 |
4 | Doctor | 12322.4 |
5 | Factor | 16228.7 |
6 | Junkers | 16232.8 |
7 | Moonlight | 21500.6 |
8 | Aisen | 19540.7 |
9 | MacGregor | 15790.8 |
Требуется вывести сотрудников, заработная плата которых находится в интервале от 16 000 до 18 000. Пишем следующий запрос с предикатом BETWEEN:
Запрос выведет следующую результирующую таблицу:
ID | Name | Salary |
3 | Marenghi | 17506.8 |
5 | Factor | 16228.7 |
6 | Junkers | 16232.8 |
Запрос выведет следующую результирующую таблицу:
ID | Name | Salary |
1 | Sanders | 18357.5 |
2 | Pernal | 15430.0 |
4 | Doctor | 12322.4 |
7 | Moonlight | 21500.6 |
8 | Aisen | 19540.7 |
9 | MacGregor | 15790.8 |
Запросы с BETWEEN: интервал задан вложенными запросами
В запросах с BETWEEN границы интервала для проверяемого столбца можно не указывать явно, задав его некоторыми условиями, которые определены вложенными запросами.
Пример 3. Продолжаем работать с базой данных Staff. Требуется вывести сотрудников, заработная плата которых находится в интервале между средней и максимальной. Пишем следующий запрос, в котором границы заданы вложенными запросами:
Результатом выполнения запроса будет следующая таблица:
ID | Name | Salary |
1 | Sanders | 18357.5 |
3 | Marenghi | 17506.8 |
7 | Moonlight | 21500.6 |
8 | Aisen | 19540.7 |
Результатом выполнения запроса будет следующая таблица:
ID | Name | Salary |
3 | Marenghi | 17506.8 |
5 | Factor | 16228.7 |
6 | Junkers | 16232.8 |
9 | MacGregor | 15790.8 |
Как видим, граничные значения интервала попали в результирующую таблицу.
Написать запрос с предикатом BETWEEN самостоятельно, а затем посмотреть решение
Пример 5. Продолжаем работать с таблицей Staff. Требуется вывести сотрудников с ID между ID сотрудника Marenghi и ID сотрудника Moonlight.
Запросы с BETWEEN: интервал задан значениями даты и времени
Интервал для извлечения строк с помощью предиката BETWEEN может быть задан не только значениями числового типа данных, но и значениями даты и времени.
Пример 6. Итак, работаем с базой данных «Недвижимость».
Таблица Deal содержит данные о сделках. Нам потребуется столбец Date, в котором указывается дата совершения сделки. Для упрощения будем считать, что в таблице представлены сделки, заключённые в течение одного года. Требуется вывести сделки, заключённые в августе и сентябре. Пишем следующий запрос:
Примеры запросов к базе данных «Недвижимость» есть также в уроках по оператору GROUP BY, предикату EXISTS, функциям ALL и ANY и LIMIT.
Оператор BETWEEN (Transact-SQL)
Определяет диапазон для проверки.
Синтаксические обозначения в Transact-SQL
Синтаксис
Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.
Аргументы
test_expression
Выражение для проверки на принадлежность диапазону в пределах от begin_expression до end_expression. Выражение test_expression должно иметь тот же тип данных, что и begin_expression и end_expression.
NOT
Указывает, что результат предиката должен быть инвертирован.
begin_expression
Любое допустимое выражение. Выражение begin_expression должно иметь тот же тип данных, что и test_expression и end_expression.
end_expression
Любое допустимое выражение. Выражение end_expression должно иметь тот же тип данных, что и test_expression и begin_expression.
AND
Служит заполнителем, который указывает на то, что значение test_expression должно находиться в диапазоне от begin_expression до end_expression.
Типы результата
Boolean
Значение результата
Оператор BETWEEN возвращает значение TRUE, если значение аргумента test_expression больше значения аргумента begin_expression или равно ему и меньше значения аргумента end_expression или равно ему.
Оператор NOT BETWEEN возвращает значение TRUE, если значение аргумента test_expression меньше значения аргумента begin_expression или больше значения аргумента end_expression.
Комментарии
Б. Использование операторов > и > ) и «меньше» ( ); так как они позволяют задавать исключающий диапазон, здесь выводятся только девять строк вместо десяти из предыдущего примера.
В. Использование оператора NOT BETWEEN
Г. Использование оператора BETWEEN со значениями типа datetime
В приведенном ниже примере возвращаются строки, в которых значения типа datetime находятся между ‘20011212’ и ‘20020105’ включительно.
Запрос дата в between как написать в sql
Создание сайтов на Django
Данный курс научит Вас создавать сайты на очень мощном фреймворке – Django. Курс состоит из 9 разделов, в которых Вы с нуля освоите данный фреймворк на примере создания полноценного Интернет-магазина.
В рамках многочисленных упражнений Вы так же создадите свой собственный сайт, что даст Вам ту необходимую практику для закрепления материала, а также полноценную серьёзную работу для своего портфолио.
Помимо самого курса Вас ждёт ещё и бесплатный ценный Бонус: «Unit-тестирование сайта на Django». В этом Бонусе Вы узнаете, как можно написать автоматические тесты для проекта на Django. Это позволит находить оперативно ошибки, а также даст возможность в будущем добавлять новый функционал, не боясь что-то сломать в старом.
Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.
Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.
Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.
Зачем Вы изучаете программирование/создание сайтов?
Создание мультиплеерной игры на Unreal Engine 4
В этом курсе Вы увидите пример создания мультиплеерной игры на Unreal Engine 4: создание персонажа, HUD, атака, блокировка, главное меню и многое другое.
Чтобы получить Видеокурс,
заполните форму
Как создать профессиональный Интернет-магазин
— Вы будете знать, как создать Интернет-магазин.
— Вы получите бесплатный подарок с подробным описанием каждого шага.
— Вы сможете уже приступить к созданию Интернет-магазина.