'00000000'的to_date转换问题

时间:2014-05-28 20:49:42

标签: plsql oracle11g

我有一个日期字段,格式为20140525(yyyymmdd)。 我使用TO_DATE(20140528,'yyyymmdd')将日期转换为05/28/2014,但是此日期字段还包含'00000000'值,这将导致TO_DATE函数由于无效月份'00'而错误输出(和可能是无效的日期错误)

如何使用to_date转换有效日期格式,同时忽略无效的'00000000'值?我仍想在查询

中保留'00000000'的日期

2 个答案:

答案 0 :(得分:1)

首先,这就是为什么将日期信息存储在除date数据类型之外的任何内容中是个坏主意。如果您的数据类型正确,生活通常会更容易。通过将日期存储为字符串,您可以使用更多空间并获得更少的价值。

如果您拥有不可转换数据的唯一情况是此00000000值,则可以

(CASE WHEN column = '00000000' 
      THEN cast(null as date)
      ELSE to_date( column, 'yyyymmdd' )
  END)

但在绝大多数情况下,一旦您的数据类型不正确,您最终会得到更多不正确的值。有人会输入一个不存在的日期(即'20140431'),这也会导致您的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 value_error
  THEN
    RETURN null;
END;

答案 1 :(得分:0)

TO_DATE(REPLACE(date, '00000000'), 'YYYYMMDD')