首页 文章

Oracle:在to_date中避免使用NULL值

提问于
浏览
4

我有一个带有where子句的函数select语句,在where子句中有一个类似的语句......

to_date(camp.start_date,'MM / DD / YYYY')> = to_date(:from_date,'YYYY-MM-DD HH24:MI:SS')

但是,如果camp.start_date为NULL或没有行,那么它会抛出异常 -

ORA-01858:找到了一个非数字字符,其中包含数字

camp.start_date实际上是一个我需要转换为日期的VARCHAR2,(是的,我知道它可能应该是一个日期字段,但我没有选项可以更改它) .

我试过这样的事......

to_date(NVL(camp.start_date,SYSDATE), 'MM/DD/YYYY') >= 
to_date(:from_date, 'YYYY-MM-DD HH24:MI:SS')

哪个仍然给我一个错误 . 也试过了

其中camp.start_date不为null且to_date(camp.start_date,'MM / DD / YYYY')> = to_date(:from_date,'YYYY-MM-DD HH24:MI:SS')

同样的问题 . 围绕这个最好的方法是什么?基本上,当camp.start_date不是有效日期时,to_date会爆炸并抛出错误 .

2 回答

  • 10

    如果 start_date 为NULL,则不会引发异常 .

    select to_date( null, 'mm/dd/yyyy' ) 
      from dual
    

    是一个完全有效的SQL语句,返回NULL .

    您得到的错误强烈暗示 start_date 列中的至少某些行实际上不是您期望的格式的字符串或映射到无效日期的字符串(即字符串'13/35/2007') . 您可以编写一个函数来测试是否可以将字符串转换为日期并返回转换日期或NULL . 然后,您可以使用它而不是 to_date .

    CREATE OR REPLACE FUNCTION my_to_date( p_str    IN VARCHAR2,
                                           p_format IN VARCHAR2 )
      RETURN DATE
    IS
    BEGIN
      RETURN to_date( p_str, p_format );
    EXCEPTION
      WHEN OTHERS
      THEN
        RETURN NULL;
    END;
    

    然后使用 my_to_date 而不是 to_date . 这应该消除你可能想要清理数据的错误,以消除无效的字符串 .

  • 0

    您需要将sysdate转换为有效的char字符串格式:

    to_date(NVL(start_date,to_char(SYSDATE,'MM/DD/YYYY')), 'MM/DD/YYYY') >= 
    to_date(from_date, 'YYYY-MM-DD HH24:MI:SS')
    

相关问题