0

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

4

2 回答 2

2

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

由于许多原因,将 VARCHAR 列用于 DATE 值是糟糕的设计。你偶然发现了其中之一。

于 2013-11-01T14:14:56.673 回答
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
*/
于 2013-11-01T16:45:34.303 回答