【问题标题】:Oracle: Avoiding NULL value in to_dateOracle:避免 to_date 中的 NULL 值
【发布时间】:2014-03-11 21:26:37
【问题描述】:

我有一个带有 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 不为空并且 to_date(camp.start_date, 'MM/DD/YYYY') >= to_date(:from_date, 'YYYY-MM-DD HH24:MI:SS')

同样的问题。解决这个问题的最佳方法是什么?当 camp.start_date 不是有效日期时,基本上 to_date 会爆炸并引发错误。

【问题讨论】:

  • 由于某种原因,这在 db_visualizer 中是可以的,但使用 Rails 会引发错误?

标签: sql oracle date datetime to-date


【解决方案1】:

如果start_date 为NULL,则不抛出异常。

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

是返回 NULL 的完全有效的 SQL 语句。

您收到的错误强烈暗示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/1/2013 也许应该是 01/01/2013?
  • @HelloWorld - 这将成功转换,这不是前导 0 的问题。您可以查找 my_to_date( camp.start_date, 'MM/DD/YYYY') is null and camp.start_date is not null 所在的行以查看无效字符串是什么。
【解决方案2】:

您需要将 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')

【讨论】:

    【解决方案3】:

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

    如果from_date 的日期类型值不为空,是否更有意义? 如果from_date 可以为空或者不是日期值,那么这样做?

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

    类似于将苹果与苹果进行比较?

    【讨论】:

    【解决方案4】:

    你可以这样使用:

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

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

    【讨论】:

    • 一个空格 (' '),而不是空字符串 ('')。并且仅在 sysdate 为空的日子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多