Включены ли запросы операторов MySQL МЕЖДУ? | Джошуа Отвелл
Ничто не сравнится с реальным опытом программирования. На самом деле, почти все в жизни познается через опыт.
Недавно я реализовывал функцию в веб-приложении стека LAMP и столкнулся с острым краем при фильтрации запроса MySQL по значениям столбца DATETIME
с использованием оператора BETWEEN
.
У меня сложилось впечатление, что МЕЖДУ
включает в себя, что означает, что любые значения в указанных диапазонах, а также те, которые соответствуют как верхнему, так и нижнему пределам, также будут включены в возвращаемый набор результатов.
МЕЖДУ
— включительно. Однако, как я обнаружил, столбец 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
Предположим, что в вашей базе данных есть следующая таблица заказов, и вы хотите получить записи
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'
Пока все.