【问题标题】:to_date conversion issue for '00000000''00000000' 的 to_date 转换问题
【发布时间】:2014-07-18 06:21:52
【问题描述】:

我有一个格式为 20140525 (yyyymmdd) 的日期字段。 我使用 TO_DATE(20140528,'yyyymmdd') 将日期转换为 2014 年 5 月 28 日,但是此日期字段还包含“00000000”值,这将导致 TO_DATE 函数由于“00”月份无效(以及大概也是无效的日期错误)

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

【问题讨论】:

  • IF 只有有条件地做某事的方法...
  • to_date(nullif(column,'00000000'),'yyyymmdd')

标签: plsql oracle11g


【解决方案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;

【讨论】:

    【解决方案2】:

    TO_DATE(REPLACE(日期, '00000000'), 'YYYYMMDD')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 2015-07-31
      • 1970-01-01
      相关资源
      最近更新 更多