Выбор всех строк, чьи промежутки времени охватывают определенное время - PullRequest
0 голосов
/ 30 мая 2019

Строки таблицы имеют столбец времени начала и столбца времени окончания.Я ищу любые строки, время которых существует между 15:00 и 16:00.Другими словами, строка должна быть включена, если: (1) ее начало и конец были между 3 и 4, (2) она начиналась до 3 и заканчивалась после 4, (3) она начиналась до 3 и заканчивалась после 3, (4) Это началось до 4 и закончилось после 4. Я попытался добавить следующее условие where, чтобы охватить эти 4 варианта, и это работает, но это занимает очень много времени.Кажется, для этого должен быть лучший код.

    Where
( 
    (
    (TO_CHAR(vltecl.Patient_in_ROOM_DTTM, 'HH24:MI:SS')                  < '15:00:00') 
    and (TO_CHAR(vltecl.patient_out_ROOM_DTTM, 'HH24:MI:SS')                 > '16:00:00')
    )
   or 
   (  (TO_CHAR(vltecl.Patient_in_ROOM_DTTM, 'HH24:MI:SS')                  < '16:00:00') 
    and (TO_CHAR(vltecl.patient_out_ROOM_DTTM, 'HH24:MI:SS')                 > '16:00:00')
    )
    or
    (
     (TO_CHAR(vltecl.Patient_in_ROOM_DTTM, 'HH24:MI:SS')                  < '15:00:00') 
    and (TO_CHAR(vltecl.patient_out_ROOM_DTTM, 'HH24:MI:SS')                 > '15:00:00')
    )
    or
     ((TO_CHAR(vltecl.Patient_in_ROOM_DTTM, 'HH24:MI:SS')                  < '16:00:00') 
    and (TO_CHAR(vltecl.patient_out_ROOM_DTTM, 'HH24:MI:SS')                 > '16:00:00')
    and (TO_CHAR(vltecl.Patient_in_ROOM_DTTM, 'HH24:MI:SS')                  > '15:00:00')
    )
    )

1 Ответ

0 голосов
/ 31 мая 2019

Работа с общим временем может быть немного затруднительной в оракуле (в отличие от определенного времени в определенный день).Подход в целом нормальный, но я думаю, что его можно немного упростить, повернув его на голову.По сути, вы хотите, чтобы каждый из них перекрывал 3-4 часа, да?Что ж, это все, что не заканчивалось до 3 или начиналось после 4 (при условии, что 'out' всегда после 'in')

Where 
NOT (TO_CHAR(vltecl.Patient_in_ROOM_DTTM, 'HH24:MI:SS')                  > '16:00:00'
    OR TO_CHAR(vltecl.Patient_OUT_ROOM_DTTM, 'HH24:MI:SS')                 < '15:00:00'
    )

Я думаю, что это работает (Нет доступа для проверки тестапрямо сейчас)

Это может все еще быть медленным, если вы имеете дело с большим количеством данных здесь - даже если даты In / Out проиндексированы, необходимо выполнить полное сканирование таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...