#sql #postgresql
Вопрос:
Здесь мне нужно получить строку, когда произойдет столкновение во времени
тип данных char для ДАТЫ, ВРЕМЕНИ НАЧАЛА и ВРЕМЕНИ ОКОНЧАНИЯ
RECORD_ID DATE START_TIME END_TIME
1. "00MS740720210616000001" "20210701" "0930" "1930"
2. "00MS740720210616000003" "20210701" "1230" "1830"
Я использовал приведенный ниже запрос
SELECT * from TIME_DATA where DATE ='20210701' and start_time >='0830' and end_time <='1830'
Результатом приведенного выше запроса является строка номер 2
RECORD_ID DATE START_TIME END_TIME
1. "00MS740720210616000001" "20210701" "0930" "1930"
Но столкновение по времени происходит для обеих строк.
Мой желаемый выход-это
RECORD_ID DATE START_TIME END_TIME
1. "00MS740720210616000001" "20210701" "0930" "1930"
2. "00MS740720210616000003" "20210701" "1230" "1830"
Комментарии:
1. Пожалуйста, определите «столкновение во времени».
2. «ВЫБЕРИТЕ * из ДАННЫХ о ВРЕМЕНИ, где ДАТА =’20210701′ и время начала >=’0830′ и время окончания > В этом запросе время начала и окончания, таким образом, пересекается со временем начала и окончания обеих записей в таблице. Это я имел в виду как столкновение времени.
Ответ №1:
Если вы ищете пересечения времени, используйте exists
:
select td.*
from time_data td
where exists (select 1
from time_data td2
where td2.date = td.date and
td2.end_time > td.start_time and
td2.start_time < td.end_time
);
Комментарии:
1. Здесь мне нужно передать значения date, start_time и end_time.
2. @Manoj . . . Просто отфильтруйте внешний запрос.