Сравнение времени между столбцами с типом данных varchar и датой - PullRequest
0 голосов
/ 23 мая 2018

В моей таблице 2 столбца, т.е. RECEIVED_TIME & PROCESSES_DATE.

  • RECEIVED_TIME - это столбец varchar, который содержит время в формате HH24MI, например, 1430 для14:30.

  • PROCESSED_DATE - это столбец даты, который содержит полную дату в формате DD-MON-YYYY HH24:MI:SS, например, 23 мая 2018 года 16:10:00 для 23 мая, 18.10..

Теперь я хочу выяснить те строки, для которых обработанная дата превышает 30 минут по сравнению с полученным временем.

Просьба помочь мне с запросом.

1 Ответ

0 голосов
/ 23 мая 2018

Ну, это имеет смысл, только если все происходит в один и тот же день.Например:

SQL> create table test
  2    (received_time  varchar2(20),
  3     processes_date date);

Table created.

SQL> insert into test values
  2    ('1430', to_date('23.05.2018 16:10:00', 'dd.mm.yyyy hh24:mi:ss'));

1 row created.

SQL> insert into test values
  2    ('1430', to_date('23.05.2018 18:10:00', 'dd.mm.yyyy hh24:mi:ss'));

1 row created.

SQL> insert into test values
  2    ('1430', to_date('23.05.2018 14:50:00', 'dd.mm.yyyy hh24:mi:ss'));

1 row created.

SQL>

Если мы преобразуем RECEIVED_TIME в тип данных DATE, мы получим следующее:

SQL> select to_date(received_time, 'hh24mi') rectim,
  2         processes_date
  3  from test;

RECTIM           PROCESSES_DATE
---------------- ----------------
01.05.2018 14:30 23.05.2018 16:10
01.05.2018 14:30 23.05.2018 18:10
01.05.2018 14:30 23.05.2018 14:50

SQL>

Ага;RECEIVED_TIME конвертируется в первый день текущего месяца.Мы сделаем то же самое с PROCESSES_DATE, используя комбинацию функций TO_DATE и TO_CHAR с соответствующими масками формата:

SQL> select to_date(received_time, 'hh24mi') rectim,
  2         to_date(to_char(processes_date, 'hh24mi'), 'hh24mi') proctim
  3  from test;

RECTIM           PROCTIM
---------------- ----------------
01.05.2018 14:30 01.05.2018 16:10
01.05.2018 14:30 01.05.2018 18:10
01.05.2018 14:30 01.05.2018 14:50

SQL>

Nice;теперь мы можем сделать некоторые вычисления и посмотреть, какая строка заняла более 30 минут;Я округляю значения до 5 десятичных знаков, чтобы сэкономить место.Также обратите внимание, что я делаю это шаг за шагом, чтобы вы увидели, как мы доберемся до минут , потому что разница двух значений типа данных DATE составляет количество дней между ними:

SQL> with inter as
  2    (select to_date(received_time, 'hh24mi') rectim,
  3            to_date(to_char(processes_date, 'hh24mi'), 'hh24mi') proctim
  4    from test
  5    )
  6  select
  7    proctim,
  8    rectim,
  9    round(proctim - rectim, 5) days,
 10    round((proctim - rectim) * 24, 5) hours,
 11    round((proctim - rectim) * 26 * 60, 5) minutes
 12  from inter;

PROCTIM          RECTIM                 DAYS      HOURS    MINUTES
---------------- ---------------- ---------- ---------- ----------
01.05.2018 16:10 01.05.2018 14:30     ,06944    1,66667  108,33333
01.05.2018 18:10 01.05.2018 14:30     ,15278    3,66667  238,33333
01.05.2018 14:50 01.05.2018 14:30     ,01389     ,33333   21,66667

SQL>

Наконец, результат, который вы ищете:

SQL> with inter as
  2    (select to_date(received_time, 'hh24mi') rectim,
  3            to_date(to_char(processes_date, 'hh24mi'), 'hh24mi') proctim
  4    from test
  5    )
  6  select
  7    proctim,
  8    rectim,
  9    round((proctim - rectim) * 26 * 60, 5) minutes
 10  from inter
 11  where (proctim - rectim) * 26 * 60 > 30;

PROCTIM          RECTIM              MINUTES
---------------- ---------------- ----------
01.05.2018 16:10 01.05.2018 14:30  108,33333
01.05.2018 18:10 01.05.2018 14:30  238,33333

SQL>
...