Oracle SQL developer显示以下代码的无效编号

Oracle SQL developer显示以下代码的无效编号,sql,oracle,Sql,Oracle,我试图减去两列,其中包含“systimestamp”作为日期和时间值。我要走了 “ORA-01722:无效号码” 作为错误消息。如果有人能帮上忙,那会很有帮助的 我尝试用谷歌搜索这个错误,它说字符串可能不是有效的文本。它适用于其他记录,唯一的问题是当我试图减去它时 SELECT ETL_BATCH_ID, ETL_BATCH_GROUP_NAME, TO_CHAR(BATCH_START_TS,'DD-MON-YY') || ' ' ||T

我试图减去两列,其中包含“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)=完成时间
但是它抛出了如上所示的特定错误

U不能对char执行任何arifmetic操作。
因此,请更改为\u char->To \u date,或者如果字段为date,则将其删除为\u char

直接对这些时间戳值应用减法:

select DW_DM_END_TS - BATCH_START_TS as "COMPLETION_TIME"              
  from bi_etl_batch;

COMPLETION_TIME
-000000000 00:02:00.000000


减法是不可能的,并且在两个字符串类型值之间没有意义。

要获得准确的结果,需要从时间戳的差值中检索小时、分钟和秒,如下所示:

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>

干杯

您正在将所有时间戳转换为varchar-显然,您不能再像时间戳那样使用它们了。