ORACLE SQL Диапазон часов

у меня проблема, у меня есть таблица с 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 из таблицы. Кто-нибудь знает, как это сделать?

Каков тип данных ваших столбцов? У Oracle нет типа данных time.

Gordon Linoff 28.05.2019 18:03

забыл указать, это varchar2

Joseph 28.05.2019 18:08

Какую версию Oracle вы используете?

APC 28.05.2019 18:14

Во-первых, я бы посоветовал вам хранить их в 24-часовом формате, а не в формате AM/PM, чтобы можно было правильно расположить значения.

Gordon Linoff 28.05.2019 18:14

Привет, APC, это 18.0

Joseph 28.05.2019 18:34

Привет, Гордон Линофф, я уже изменил его, но у меня та же проблема.

Joseph 28.05.2019 18:34
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
6
344
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я предполагаю, что вы преобразовали формат времени в 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'
  ;

дб <> рабочий пример здесь

Привет, спасибо за вашу помощь, я уже нашел решение и ответил на него, я очень ценю вашу помощь!

Joseph 28.05.2019 19:44
Ответ принят как подходящий

я уже нашел решение своей проблемы, как рекомендацию из комментария к моему вопросу, когда я изменил формат часов и формат новых часов, это сработало отлично. Вот код для тех, у кого возникнет такая же проблема в будущем.

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;
/

Спасибо за всю нашу помощь.

Другие вопросы по теме