Включены ли запросы операторов MySQL МЕЖДУ? | Джошуа Отвелл

Ничто не сравнится с реальным опытом программирования. На самом деле, почти все в жизни познается через опыт.

Недавно я реализовывал функцию в веб-приложении стека LAMP и столкнулся с острым краем при фильтрации запроса MySQL по значениям столбца DATETIME с использованием оператора BETWEEN .

Изображение OpenClipart-Vectors с Pixabay

У меня сложилось впечатление, что МЕЖДУ включает в себя, что означает, что любые значения в указанных диапазонах, а также те, которые соответствуют как верхнему, так и нижнему пределам, также будут включены в возвращаемый набор результатов.

МЕЖДУ включительно. Однако, как я обнаружил, столбец DATETIME с типом данных действует несколько неожиданно , когда является частью запроса диапазона BETWEEN . По крайней мере, таков был мой опыт в этом случае. Поскольку мой запрос не возвращал правильное количество ожидаемых строк, это побудило меня продолжить расследование и попытаться выяснить, почему.

В конце концов, неправильные результаты запроса — это всего лишь ошибка; неправильный .

Веб-приложение, над которым я работаю, использует MariaDB 10.2.38. Однако я использую MySQL версии 8.0.25 для данных и примеров в этом посте.

Настройка фиктивных данных

Я создам простую таблицу для демонстрационных целей, имеющую 3 столбца:

Хотя мне не обязательно нужна часть компонента Time типа данных DATETIME , красота использования его в столбце определение — это возможность установить DEFAULT to CURRENT_TIMESTAMP() и ВСТАВЬТЕ строк, используя ключевое слово DEFAULT , если вы хотите, чтобы текущее DateTime было значением столбца:

Для тех случаев, когда вам нужно сохранить определенную дату, вы можете легко ВСТАВЬТЕ и их, опуская часть времени:

Все следующие запросы выполняются на момент написания этой статьи, 2 июня 2021 г. , как показано с помощью функции CURRENT_TIMESTAMP() :

Данные, представленные в таблице «practice_names», показаны ниже:

Все данные из таблицыpractice_names.

Фильтрация строк по дате с использованием BETWEEN

Если я хочу, чтобы все строки возвращались между — и включая — даты «2021–05–31» и «2021–06–02», этот запрос сделает это:

Результаты запроса без правильного количество рядов.

Подождите минутку.

Результаты этого запроса неверны.

Две строки со значениями даты «2021–06–02» также должны быть включены в возвращаемый набор результатов.

Что дает?

Приведение типов с использованием функции CAST() Напомним, столбец был создан как тип данных

DATETIME ), чтобы запрос возвращал правильное количество строк.

Использование функции CAST() в предложении WHERE , как показано в модифицированном запросе ниже, возвращает правильное количество строк:

Результаты запроса с возвращенными правильными строками

Почему этот запрос работает, когда преобразование типа столбца DATETIME в DATE с использованием CAST() ?

Посмотрим, сможем ли мы ответить на него дополнительными запросами. ..

Я могу гарантировать вам одну вещь. Если вы купите мне кофе, я его выпью!!!

Включение части времени в запросы BETWEEN.

На основе данных, представленных в таблице «practice_names», строки с id значения 1 и 2 имеют часть времени 19:08:16 . Напомним, эти 2 строки были вставлены со значением столбца DEFAULT ( CURRENT_TIMESTAMP() ).

Я выполню запрос без использования CAST() и включу часть времени в верхнее значение :

Включая часть времени в запрос…

Никаких изменений.

Теперь, как насчет того, чтобы включить часть Time вплоть до полуночи?

Включая часть времени почти до полуночи…

В этом запросе возвращено правильное количество строк.

Я чувствую, что , включив значение части времени 23:59:59 , строки с id 1 и 2 возвращаются, потому что их части времени 19:08:16 находятся между ними. указанные нижний и верхний диапазоны МЕЖДУ .

Включение значения доли времени, вероятно, не является практичным решением, поскольку вам потребуется знание из первых рук значений доли времени для каждого DATETIME , если только компоненты времени не являются неотъемлемой частью ваших конкретных бизнес-требований. В моем случае порции времени были менее важны (по крайней мере, я так думал!).

Дополнительные информационные ресурсы

  • Для получения дополнительной информации посетите онлайн-документацию MySQL для типов данных DATE, DATETIME и TIMESTAMP. (внешняя ссылка)
  • Оператор MySQL BETWEEN (внешняя ссылка)
  • Функция MySQL CAST() (внешняя ссылка)

Я надеюсь, что если вы столкнулись с таким же типом несоответствия в ДАТА или ДАТАВРЕМЯ запросы столбцов с использованием МЕЖДУ , вы можете устранять неполадки с большей легкостью теперь, когда вы прочитали этот пост и поняли один из способов решения этого типа запроса.

Дополнительная литература

Обязательно посетите любой из следующих постов в блоге для получения аналогичного содержания:

  • MySQL Searched CASE Expression — с примерами0150

Понравилось содержание, которое вы прочитали в этом посте? Тогда вам наверняка понравятся записи в моем блоге Digital Owl’s Prose (внешняя ссылка ).

Здесь вы найдете сообщения в блогах о разработке/программировании баз данных SQL и веб-разработке стека LAMP.

Недавно я начал еженедельную рассылку по электронной почте, в которой делюсь всем, что меня интересует, что я изучаю или о чем писал в SQL/PHP. Если это то, что вас интересует, зарегистрируйтесь здесь.

Как выбрать данные между двумя датами в MySQL

Главная » Как выбрать данные между двумя датами в MySQL

Последнее обновление: 27 декабря 2020 г., команда ScratchCode

Очень часто задаваемые вопросы, как выбрать данные между двумя датами в MySQL или PHP. Способов сделать это может быть множество, но мы рассмотрим некоторые из простых и хороших способов. Мы надеемся, что Вам понравится. Итак, вы готовы это сделать? Давайте сразу приступим к делу.

Выбор данных из базы данных между двумя датами

01 Используйте МЕЖДУ….И…. Оператор сравнения

Как следует из названия, используется для проверки того, находится ли значение в диапазоне или нет.

Синтаксис:

`your_column_name` МЕЖДУ 'начальным значением' И 'конечным значением'
 

Пример синтаксиса:

`order_date` МЕЖДУ '2020-04-05' И '2020-04-10' // Повторный запуск данных, включая 05-04-2020 по 10-04-2020
`order_date` МЕЖДУ '2020-04-05' И CURDATE() // Повторный запуск данных, включая 05-04-2020, до текущей даты
 

Обратите внимание, что оператор сравнения BETWEEN…AND… возвращает записи, включающие как начальное, так и конечное значение.

Давайте посмотрим на несколько реальных примеров МЕЖДУ… И…. оператор сравнения

Имя таблицы: order

Предположим, что в вашей базе данных есть следующая таблица заказов, и вы хотите получить записи

между ‘2020-04-15’ и ‘2020-04-30’

ID | user_id| кол-во | дата_заказа |
-----------+---------+-----+------------+
1 | 5 | 7 | 2020-04-06 |
2 | 7 | 14 | 2020-04-17 |
3 | 8 | 1 | 20.04.2020 |
4 | 100 | 5 | 2020-04-25 |
5 | 101 | 7 | 2020-04-30 |
6 | 17 | 8 | 2020-04-15 |
7 | 25 | 2 | 2020-05-25 |
8 | 24 | 1 | 2020-05-15 |
9| 10 | 10 | 2020-05-28 |
 

Таким образом, запрос будет выглядеть следующим образом:

SELECT * FROM `order` WHERE `order_date` МЕЖДУ '2020-04-15' И '2020-04-30'
 

Выход :

ID | user_id| кол-во | дата_заказа |
-----------+---------+-----+------------+
2 | 7 | 14 | 2020-04-17 |
3 | 8 | 1 | 20.04.2020 |
4 | 100 | 5 | 2020-04-25 |
5 | 101 | 7 | 2020-04-30 |
 
02 Использование > AND
< Оператор сравнения

Вы также можете использовать оператор сравнения > (больше) и < (меньше) для выборки записей между двумя датами.

Синтаксис:

`имя-столбца` >= 'начальное значение' И `имя-столбца` <= 'конечное значение'
 

Таким образом, ваш запрос будет выглядеть так, как показано ниже для той же вышеупомянутой таблицы заказов.

SELECT * FROM `order`, ГДЕ `order_date` >= '2020-04-15' И `order_date` <= '2020-04-30'
 

Примеры

Здесь мы покажем вам различные примеры диапазонов дат, такие как выбор записей между двумя годами, месяцем и т. д. Давайте посмотрим.

01 Выбор записей за два года

Чтобы выбрать записи за два года, нам нужно извлечь год из даты, поэтому в таком случае будет использоваться функция ГОД(). Вам просто нужно поместить дату или столбец в функцию YEAR().

Предположим, вы хотите получить все записи между 2019 и 2020 , поэтому запрос будет выглядеть так, как показано ниже.

SELECT * FROM `order` ГДЕ ГОД(дата_заказа) МЕЖДУ «2019» И «2020»
 
02 Выбор записей за два месяца

Чтобы выбрать записи между двумя месяцами, нам нужно извлечь месяц из даты, поэтому в таком случае будет использоваться функция МЕСЯЦ(). Вам просто нужно поместить дату или столбец в функцию МЕСЯЦ().

Предположим, вы хотите получить все записи за

МАЯ И ИЮНЯ месяцев, поэтому запрос будет выглядеть так, как показано ниже.

SELECT * FROM `order` ГДЕ МЕСЯЦ (дата_заказа) МЕЖДУ '05' И '06'
 
03 Выбрать все записи за два месяца определенного года
SELECT * FROM `order` ГДЕ МЕСЯЦ (дата_заказа) МЕЖДУ «05» И «06» И ГОД (дата_заказа) = «2020»
 
04 Выбрать все записи определенного месяца
SELECT * FROM `order` ГДЕ МЕСЯЦ (дата_заказа) = '05'
 
05 Выбрать все записи текущего месяца
SELECT * FROM `заказ`, ГДЕ МЕСЯЦ (дата_заказа) = МЕСЯЦ (ДАТА СРОКА ())
 
06 Выбрать все записи определенного года
SELECT * FROM `order` ГДЕ ГОД(дата_заказа) = '2020'
 
07 Выбрать все записи текущего года
SELECT * FROM `заказ`, ГДЕ ГОД (дата_заказа) = ГОД (ДАТА_ТОКА())
 
08 Выбрать все записи определенного месяца и года
SELECT * FROM `order` ГДЕ МЕСЯЦ (дата_заказа) = '05' И ГОД (дата_заказа) = '2020'
 

Пока все.