Oracle:在to_date中避免使用NULL值

时间:2014-03-11 21:26:37

标签: sql oracle date datetime to-date

我有一个带有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会爆炸并抛出错误。

4 个答案:

答案 0 :(得分: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。这应该消除你得到的错误。但是,您可能希望清理数据,以消除无效字符串。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您可以这样使用:

NVL(TO_CHAR(SYSDATE,'DD-MM-YYYY'),' ')

这会将日期转换为字符串格式,然后转换为空字符串。

答案 3 :(得分:-1)

NVL(TO_DATE(start_date,'MM/DD/YYYY'),SYSDATE) >= from_date

如果from_date具有不为空的日期类型值,请发表更多看法? 如果from_date可以为null或不是日期值,那么这样做吗?

NVL(TO_DATE(start_date,'MM/DD/YYYY'),SYSDATE) >= NVL(TO_DATE(from_date,'MM/DD/YYYY'),SYSDATE)

有点像把苹果比作苹果吗?