我在数据库中有一个名为“ExamDate”的字符串字段,其中包含日期。最初,应用程序没有前端验证,数据库保存为字符串,因此用户可以以任何格式输入日期。
所需格式为DD-MMM-YYYY,但目前该字段包含所有格式的值,例如:
我必须在数据库视图中显示此字段,并将所有字段转换为日期格式。
我试过的各种选项给我的错误如下: “找到了数字所在的非数字字符”或 “无效号码”
我也意识到“日期”字段在几个日期中缺失,例如“2017年5月”,需要设置为2017年5月1日。
您是否建议使用与路径下方粘贴的解决方案类似的解决方案:How to update dates stored as varying character formats (PL/SQL)?
SELECT ANTICIPATEDSPUD
,DECODE (
INSTR (ANTICIPATEDSPUD, '-')
,5, TO_DATE (ANTICIPATEDSPUD, 'YYYY-MM-DD')
,3, TO_DATE (ANTICIPATEDSPUD, 'MM-DD-YYYY')
,DECODE (LENGTH (ANTICIPATEDSPUD)
,8, TO_DATE (ANTICIPATEDSPUD, 'MM/DD/YY')
,10, TO_DATE (ANTICIPATEDSPUD, 'MM/DD/YYYY')))
FROM FSW_BASIC_WELL_INFO_VW;
答案 0 :(得分:1)
也许您可以尝试对共享相同格式的数据进行分组。 REGEXP_LIKE
在这种情况下可能会派上用场。它可能没问题,因为它允许你升级"一旦你发现人们用来输入数据的另一种格式,它就很容易了。
由于拼写错误,以下示例当然不是理想的;几个月可能是" Ferubrary"或者" Mya&#34 ;;天数可能是35天,13个月等等,因此您必须检查这些值是否有意义。
反正;看一看。我已将ID列仅用于排序目的。
SQL> alter session set nls_date_language = 'english';
Session altered.
SQL> alter session set nls_date_format = 'dd.mm.yyyy';
Session altered.
SQL> with test (id, datum) as
2 (select 1, '14-Jun-2017' from dual union
3 select 2, '9/15/2017' from dual union
4 select 3, 'May 2017' from dual union
5 select 4, 'February 1, 2017' from dual union
6 select 5, null from dual
7 )
8 select id, datum, to_date(datum, 'dd-mon-yyyy') result from test
9 where regexp_like(datum, '[0-9]{1,2}-[[:alpha:]]{3}-[0-9]{4}')
10 union
11 select id, datum, to_date(datum, 'mm/dd/yyyy') from test
12 where regexp_like(datum, '[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}')
13 union
14 select id, datum, to_date(datum, 'mon yyyy') from test
15 where regexp_like(datum, '[[:alpha:]]{3} [0-9]{4}')
16 union
17 select id, datum, to_date(datum, 'month dd, yyyy') from test
18 where regexp_like(datum, '\w+ [0-9]{1,2}, [0-9]{4}')
19 order by id;
ID DATUM RESULT
---------- ---------------- ----------
1 14-Jun-2017 14.06.2017
2 9/15/2017 15.09.2017
3 May 2017 01.05.2017
4 February 1, 2017 01.02.2017
SQL>