Oracle SQL developer显示以下代码的无效编号
我试图减去两列,其中包含“systimestamp”作为日期和时间值。我要走了 “ORA-01722:无效号码” 作为错误消息。如果有人能帮上忙,那会很有帮助的 我尝试用谷歌搜索这个错误,它说字符串可能不是有效的文本。它适用于其他记录,唯一的问题是当我试图减去它时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
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-显然,您不能再像时间戳那样使用它们了。