у меня проблема, у меня есть таблица с 3 столбцами
- date - varchar2 - varchar2 -
| date | start_hour | end_hour |
Мне нужно сделать проверку, чтобы не перекрывать диапазоны часов.
Например:
| date | start_hour | end_hour |
| date1 | 09:00AM | 09:30AM |
| date1 | 10:30AM | 11:30AM |
| date1 | 01:00PM | 03:00PM |
Предполагая, что дата одинакова для 3 строк.
Мне нужно, чтобы эти диапазоны не пересекались
Я не могу вставлять такие диапазоны
start_hour = 08:00 и end_hour = 09:20, потому что диапазон между 09:00 и 09:30 уже существует, поэтому новый диапазон конфликтует с диапазоном, существующим в таблице.
Я пробовал так много запросов, но не между ними, end_hour, который я вставляю, должен быть меньше, чем start_hour из таблицы.
Кто-нибудь знает, как это сделать?
забыл указать, это varchar2
Какую версию Oracle вы используете?
Во-первых, я бы посоветовал вам хранить их в 24-часовом формате, а не в формате AM/PM, чтобы можно было правильно расположить значения.
Привет, APC, это 18.0
Привет, Гордон Линофф, я уже изменил его, но у меня та же проблема.
Я предполагаю, что вы преобразовали формат времени в hh24:mi
может это поможет:
with tab as(
select 'date1' as dat, '09:00' as start_hour, '09:30' as end_hour from dual union all
select 'date1' as dat, '10:30' as start_hour, '11:30' as end_hour from dual union all
select 'date1' as dat, '13:00' as start_hour, '15:00' as end_hour from dual
)
SELECT COUNT(*)
FROM tab
WHERE start_hour <= '09:10' --:new_end_hour
AND end_hour >= '07:00' --:new_start_hour
AND dat = 'date1'
;
или вы можете использовать between
, чтобы проверить это start_hour
или end_hour
ist между значениями
with tab as(
select 'date1' as dat, '09:00' as start_hour, '09:30' as end_hour from dual union all
select 'date1' as dat, '10:30' as start_hour, '11:30' as end_hour from dual union all
select 'date1' as dat, '13:00' as start_hour, '15:00' as end_hour from dual
)
SELECT COUNT(*)
FROM tab
WHERE ('09:00' between start_hour and end_hour
or '09:10' between start_hour and end_hour
)
AND dat = 'date1'
;
дб <> рабочий пример здесь
Привет, спасибо за вашу помощь, я уже нашел решение и ответил на него, я очень ценю вашу помощь!
я уже нашел решение своей проблемы, как рекомендацию из комментария к моему вопросу, когда я изменил формат часов и формат новых часов, это сработало отлично. Вот код для тех, у кого возникнет такая же проблема в будущем.
DECLARE
l_count NUMBER(1) := 0;
BEGIN
SELECT COUNT(*)
INTO l_count
FROM table
WHERE start_hour <= :new_start_hour
AND end_hour >= :new_end_hour
AND date = :date
AND ROWNUM = 1;
dbms_output.put_line(l_count);
END;
/
Спасибо за всю нашу помощь.
Каков тип данных ваших столбцов? У Oracle нет типа данных
time
.