У меня есть этот дизайн БД:
Tasks table
- id
- start (datetime)
- end (datetime)
В моем приложении я передал 2 параметра даты начала и окончания, чтобы он проверял, не находятся ли эти параметры между теми началом и концом в моей записи БД.
Например, в моей записи БД у меня есть следующие данные:
id | start | end
001 | 2022-01-19 07:00:00 | 2022-01-19 09:00:00
Затем параметр, который я передал в свое приложение:
start = 2022-01-19 09:00:00
end = 2022-01-19 10:00:00
Я хочу проверить, находятся ли эти параметры времени начала и окончания между этими записями в моей БД. В идеале это должно возвращать 0 rows
, потому что время начала может быть равно времени окончания в записи в БД.
Другой сценарий заключается в том, что когда я передал эти параметры своему приложению:
start = 2022-01-19 06:00:00
end = 2022-01-19 07:00:00
Он также должен возвращать 0 rows
, потому что время окончания может быть равно времени начала в записи в БД.
Это запрос mySQL, но это неправильно, потому что он возвращает результат:
select * from tasks WHERE (start >= '2022-01-19 09:00:00' AND start <= '2022-01-19 10:00:00') OR (end >= '2022-01-19 09:00:00' AND end <= '2022-01-19 10:00:00')
Ваша помощь значительно ценится. Спасибо!
3 ответа
Похоже, вы хотите обнаруживать коллизии между интервалами и возвращать окончательный счет, если таковой имеется, с переданными параметрами.
Таким образом, мы будем проверять, происходит ли какое-либо событие после того, как событие, переданное в параметрах, закончилось, или какое-либо событие происходит и заканчивается только до начала события, переданного в параметрах. Это гарантирует отсутствие столкновений. Мы будем отрицать (!
) результат, чтобы сказать, что есть коллизия (если есть).
Вы можете следовать следующему формату:
select *
from tasks
WHERE !(start >= {end_parameter_time} OR end <= {start_parameter_time})
Точнее для вашего случая/примера это будет:
select *
from tasks
WHERE !(start >= '2022-01-19 07:00:00' OR end <= '2022-01-19 06:00:00')
Запрос для проверки того, пересекается ли диапазон дат [@d1, @d2)
с диапазоном дат [start, end)
, выглядит следующим образом:
SELECT *
FROM tasks
WHERE @d2 > start
AND @d1 < end
Кумуста капва пиной! Вы можете использовать BETWEEN
, чтобы проверить, находятся ли данные, которые вы передаете, между start
и end
. Вы можете изменить свой запрос следующим образом:
select * from tasks WHERE (start BETWEEN '2022-01-19 09:00:00' AND '2022-01-19 10:00:00') OR (end BETWEEN '2022-01-19 09:00:00' AND '2022-01-19 10:00:00')
Вы можете проверить Sql МЕЖДУ оператором
Оператор BETWEEN выбирает значения в заданном диапазоне. Значения могут быть числами, текстом или датами.
Оператор BETWEEN является инклюзивным: включаются начальное и конечное значения.
МЕЖДУ СИНТАКСИСОМ
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2;
0 rows
, потому что время окончания может быть равно времени начала в записи в БД, а также время начала может быть равно концу время в записи в БД. Спасибо! :)
Похожие вопросы
Новые вопросы
php
PHP - это широко используемый высокоуровневый, динамический, объектно-ориентированный и интерпретируемый язык сценариев, в первую очередь предназначенный для серверной веб-разработки. Используется для вопросов о языке PHP.
start = 2022-01-19 06:00:00; end = 2022-01-19 10:00:00
(включает) иstart = 2022-01-19 07:10:00; end = 2022-01-19 08:50:00
(включает) - совпадают ли некоторые из них и должны быть возвращены? Это запрос mySQL, но он неверен, поскольку возвращает результат. Вам не нужны соседние интервалы, поэтому используйте сильные, а не слабые операторы сравнения.ranges
указать должен ли вывод быть 0 или 1 строк.