ORA-01722:无效数字 - 减去日期

时间:2014-06-27 13:33:15

标签: sql oracle

我有一个查询,我正在尝试编写/运行...如果我进一步使用WHERE过滤器并添加" rownum<我可以让它返回结果100&#34 ;.我可以继续增加它,它会扩展结果..但是,如果我删除它并让它完整运行它会抛出一个oracle sql错误:

数据库错误:511 - ORA-01722:无效数字

非常感谢任何帮助!

SELECT inventory_view.prtnum, inventory_view.lotnum, inventory_view.expire_dte,     inventory_view.mandte, to_number(inventory_view.expire_dte - inventory_view.mandte) As "DELTA", SUBSTR(inventory_view.age_pflnam, 1, 3) As "Age Profile", to_number((inventory_view.expire_dte - inventory_view.mandte)) - to_number(SUBSTR(inventory_view.age_pflnam, 1, 3)) AS "DELTA 2", lst_arecod, prt_client_id
FROM inventory_view
WHERE inventory_view.prtnum = inventory_view.prtnum
AND lst_arecod <> 'SHIP'
AND prt_client_id = 'TEST'

2 个答案:

答案 0 :(得分:0)

您收到错误,因为某个特定行和列的to_number转换之一失败。在您点击该行之前,您不会收到错误,这解释了and rownum < ...成功运行的原因。

要确定错误值,您可以尝试以下查询,该查询测试正在转换的列的值,以用于非数字值。

SELECT 
    inventory_view.prtnum, 
    inventory_view.lotnum, 
    inventory_view.expire_dte,     
    inventory_view.mandte, 
    to_number(inventory_view.expire_dte - inventory_view.mandte) As "DELTA", 
    SUBSTR(inventory_view.age_pflnam, 1, 3) As "Age Profile", 
    to_number((inventory_view.expire_dte - inventory_view.mandte)) - to_number(SUBSTR(inventory_view.age_pflnam, 1, 3)) AS "DELTA 2", 
    lst_arecod, 
    prt_client_id
SELECT inventory_view.*
FROM inventory_view
WHERE lst_arecod <> 'SHIP'
AND prt_client_id = 'TEST'
AND 
(LOWER(inventory_view.expire_dte) <> UPPER(inventory_view.expire_dte)
OR LOWER(inventory_view.mandte) <> UPPER(inventory_view.mandte)
OR LOWER(SUBSTR(inventory_view.age_pflnam, 1, 3)) <> UPPER(SUBSTR(inventory_view.age_pflnam, 1, 3))
);

此外,您可以在原始查询中排除这些非数字值,如下所示:

SELECT 
    inventory_view.prtnum, 
    inventory_view.lotnum, 
    inventory_view.expire_dte,     
    inventory_view.mandte, 
    to_number(inventory_view.expire_dte - inventory_view.mandte) As "DELTA", 
    SUBSTR(inventory_view.age_pflnam, 1, 3) As "Age Profile", 
    to_number((inventory_view.expire_dte - inventory_view.mandte)) - to_number(SUBSTR(inventory_view.age_pflnam, 1, 3)) AS "DELTA 2", 
    lst_arecod, 
    prt_client_id
SELECT inventory_view.*
FROM inventory_view
WHERE lst_arecod <> 'SHIP'
AND prt_client_id = 'TEST'
AND LOWER(inventory_view.expire_dte) = UPPER(inventory_view.expire_dte)
AND LOWER(inventory_view.mandte) = UPPER(inventory_view.mandte)
AND LOWER(SUBSTR(inventory_view.age_pflnam, 1, 3)) = UPPER(SUBSTR(inventory_view.age_pflnam, 1, 3));

请注意,inventory_view.prtnum = inventory_view.prtnum条件已被删除,因为它始终为TRUE。

答案 1 :(得分:-1)

抱歉,这不是您问题的直接答案,但如果您仍然需要帮助,我的类似问题的解决方案可能会给您一些想法。 这里我减去两个日期以显示已过去的小时数。 ,to_char(PEH.HOSP_DISCH_TIME-PEH.HOSP_ADMSN_TIME,&#39; 99.99&#39;)* 24作为LOS_hrs 一个帐户导致ora-01722。 这个数字对于99.99&#39;来说太大了。改为&#39; 999.99&#39;做了伎俩。 然而,我仍然感到困惑,因为结果超过了1000。