Разработчик Oracle SQL показывает неверный номер для кода ниже - PullRequest
2 голосов
/ 01 октября 2019

Я пытаюсь вычесть два столбца, которые содержат "systimestamp" в качестве значения даты и времени. Я получаю

'ORA-01722: неверный номер'

в качестве сообщения об ошибке. Было бы очень полезно, если кто-то может помочь.

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

SELECT ETL_BATCH_ID,
       ETL_BATCH_GROUP_NAME,
       TO_CHAR(BATCH_START_TS,'DD-MON-YY')
       || ' '
       ||TO_CHAR(BATCH_START_TS,'HH24:MI:SS') "BATCH_START_TS",
       TO_CHAR(DW_DM_END_TS ,'DD-MON-YY')
       ||' '
       ||TO_CHAR(DW_DM_END_TS , 'HH24:MI:SS') "DW_DM_END_TS" , 
       (TO_CHAR(DW_DM_END_TS , 'HH24:MI:SS')) - (TO_CHAR(BATCH_START_TS,'HH24:MI:SS')) "COMPLETION_TIME"              
FROM   bi_etl.bi_etl_batch
WHERE ETL_BATCH_GROUP_NAME = 'CMD';

Например,

BATCH_START_TS    || DW_DM_END_TS     || COMPLETION_TIME 
01-OCT-19 3:18:00 ||01-OCT-19 3:20:00 || 00:02:00         

Так что время завершения (DW_DM_END_TS) - (BATCH_START_TS) = COMPLETION_TIME Но выдает конкретную ошибку, как показано выше

Ответы [ 3 ]

2 голосов
/ 01 октября 2019

Применить Подстановку непосредственно к этим значениям отметки времени:

select DW_DM_END_TS - BATCH_START_TS as "COMPLETION_TIME"              
  from bi_etl_batch;

COMPLETION_TIME
-000000000 00:02:00.000000

Демо

Подстановка невозможна и не имеет смысла для двух строковых типовзначения.

0 голосов
/ 01 октября 2019

Для получения точного результата вам нужно извлечь часы, минуты и секунды из разницы в отметке времени, например:

SELECT
    ETL_BATCH_ID,
    ETL_BATCH_GROUP_NAME,
    BATCH_START_TS,
    DW_DM_END_TS,
    LPAD(EXTRACT(HOUR FROM COMPLETION_TIME), 2, 0)
    || ':'
    || LPAD(EXTRACT(MINUTE FROM COMPLETION_TIME), 2, 0)
    || ':'
    || LPAD(ROUND(EXTRACT(SECOND FROM COMPLETION_TIME)), 2, 0) AS COMPLETION_TIME
FROM
    (
        SELECT
            ETL_BATCH_ID,
            ETL_BATCH_GROUP_NAME,
            TO_CHAR(BATCH_START_TS, 'DD-MON-YY')
            || ' '
            || TO_CHAR(BATCH_START_TS, 'HH24:MI:SS') "BATCH_START_TS",
            TO_CHAR(DW_DM_END_TS, 'DD-MON-YY')
            || ' '
            || TO_CHAR(DW_DM_END_TS, 'HH24:MI:SS') "DW_DM_END_TS",
            DW_DM_END_TS - BATCH_START_TS "COMPLETION_TIME"
        FROM
            BI_ETL.BI_ETL_BATCH
        WHERE
            ETL_BATCH_GROUP_NAME = 'CMD'
    );

Пример:

SQL> SELECT
  2      LPAD(EXTRACT(HOUR FROM DIFF), 2 , 0) || ':' ||
  3      LPAD(EXTRACT(MINUTE FROM DIFF), 2 , 0) || ':' ||
  4      LPAD(ROUND(EXTRACT(SECOND FROM DIFF)), 2 , 0) as diff
  5  FROM
  6      (
  7          SELECT
  8              SYSTIMESTAMP - ( SYSTIMESTAMP - 2 / 1440 ) AS DIFF
  9          FROM
 10              DUAL
 11      );

DIFF
--------------------------
00:02:01

SQL>

Приветствия! !

0 голосов
/ 01 октября 2019

U не может выполнить арифметическую операцию на char. поэтому измените To_char -> To_date или удалите to_char, если поля имеют дату

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