У меня есть этот дизайн БД:

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')

Ваша помощь значительно ценится. Спасибо!

0
PinoyStackOverflower 19 Янв 2022 в 08:39
Вам действительно нужно "не между"? 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, но он неверен, поскольку возвращает результат. Вам не нужны соседние интервалы, поэтому используйте сильные, а не слабые операторы сравнения.
 – 
Akina
19 Янв 2022 в 08:56
dbfiddle.uk/… — для каждой отдельной строки в ranges указать должен ли вывод быть 0 или 1 строк.
 – 
Akina
19 Янв 2022 в 09:03

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')

Онлайн-демонстрация

0
nice_dev 19 Янв 2022 в 10:30

Запрос для проверки того, пересекается ли диапазон дат [@d1, @d2) с диапазоном дат [start, end), выглядит следующим образом:

SELECT *
FROM tasks
WHERE @d2 > start
AND   @d1 < end
0
Salman A 19 Янв 2022 в 10:55

Кумуста капва пиной! Вы можете использовать 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;

-1
The Cool Cat 19 Янв 2022 в 08:52
1
Привет пиной! :D спасибо за ответ! :) Я думаю, что этот ответ неверен, потому что, как я сказал, он должен возвращать 0 rows, потому что время окончания может быть равно времени начала в записи в БД, а также время начала может быть равно концу время в записи в БД. Спасибо! :)
 – 
PinoyStackOverflower
19 Янв 2022 в 08:53
1
Вы можете использовать BETWEEN, чтобы проверить, находятся ли данные, которые вы передаете, между началом и концом. Неверно. BETWEEN выполняет слабое сравнение.
 – 
Akina
19 Янв 2022 в 08:57