Выберите, где дата-время начинается больше и заканчивается меньше

#mysql #sql #datetime #date-range

Вопрос:

У меня есть таблица с начальным и конечным полями со значениями, такими как:

 start               | end
2021-09-24 17:00:00 | 2021-10-01 08:00:00
 

У меня затуманилась голова, и я не могу понять, почему это утверждение ни к чему не приводит:

 SELECT *
FROM `oncall`
WHERE `start` >= '2021-10-01 02:00:00'
AND   `end`   <= '2021-10-01 08:00:00'
 

хотя диапазон дат в строке моего примера содержит указанный выше диапазон.

Я пытаюсь найти любую строку, которая перекрывает начало и конец значений в базе данных.

Комментарии:

1. Каков тип данных столбцов start и. end

2. Те DATE_FORMAT() ничего не делают, немного похоже A = A

3. Оба столбца являются ДАТАМИ и ВРЕМЕНЕМ

4. Я знаю, что ФОРМИАТ ничего не делает, хватаясь за соломинку

5. Я бы пошел на WHERE `start` >= '2021-10-01 02:00:00' AND `end` <= '2021-10-01 08:00:00'

Ответ №1:

Глядя на запись в вашей базе данных и запрос, который вы используете, кажется, что вы на самом деле ищете запрос на перекрытие интервала дат, т. Е. Запрос, который проверяет [2021-10-01 02:00:00, 2021-10-01 08:00:00) , не перекрывается ли [2021-09-24 17:00:00, 2021-10-01 08:00:00) каким-либо образом.

 SELECT *
FROM `oncall`
WHERE @d2 > `start` AND `end` > @d1

-- replace @d1 and @d2 with actual values
 

Обратите внимание, что этот запрос работает для всех видов перекрытия. Например, если у вас есть эта пара дат в вашей базе данных:

 2021-10-11 | 2021-10-15
 

тогда все эти входные пары будут совпадать:

 2021-10-01 | 2021-10-12
2021-10-14 | 2021-10-20
2021-10-01 | 2021-10-20
2021-10-11 | 2021-10-14
 

Комментарии:

1. Спасибо тебе за это, просто не мог этого видеть.

2. Может быть, вы могли бы обновить вопрос так, чтобы он давал смутное представление о том, что это на самом деле то, чего вы хотели достичь