PL / SQL当某些值不是日期格式时,将字符串转换为日期?

时间:2013-11-01 14:09:23

标签: oracle plsql to-date

我有一个字符串字段,其中99%的条目采用可以转换为日期的格式,即To_DATE(' 20100501', 'yyyymmdd')效果很好。但是,大约1%的条目属于'00000000''00000500'。因此,当我尝试将TO_DATE函数应用于所有值时,即SELECT TO_DATE(datefield, 'yyyymmdd'),结果是错误(not a valid month/year),因为年份或月份对某些条目无效。我不知道该怎么做。也许我可以在应用了日期验证后将TO_DATE函数作为子查询的一部分?也许将这些非日期格式转换为类似19000101的格式以避免错误???

2 个答案:

答案 0 :(得分:2)

最佳解决方案是首先将损坏的值转换为有效日期(或将其转换为null或将它们存储在新字段中),然后将列转换为DATE类型。

为DATE值使用VARCHAR列的设计很差,原因很多。你偶然发现了其中一个。

答案 1 :(得分:0)

SELECT  CASE
            WHEN to_number(a_date) > 19000101
            THEN to_date(a_date, 'YYYYMMDD')
            ELSE DATE'1900-01-01'
        END d_date
FROM
(
        SELECT '20130101' a_date FROM dual UNION ALL
        SELECT '20120101'        FROM dual UNION ALL
        SELECT '20110101'        FROM dual UNION ALL
        SELECT '20100101'        FROM dual UNION ALL
        SELECT '00000000'        FROM dual UNION ALL
        SELECT '00000500'        FROM dual
)
;
/*
2013-01-01 00:00:00
2012-01-01 00:00:00
2011-01-01 00:00:00
2010-01-01 00:00:00
1900-01-01 00:00:00
1900-01-01 00:00:00
*/