项目背景
介于某ToG项目,在项目实施阶段需要进行相关的数据迁移,而在进行数据迁移的过程中,发现需要迁移的数据,存在诸多问题,而在各类问题中,尤以日期问题存在较为严重,在经过一天的日期数据处理中积累了些许处理经验,故于此整理。
问题清单
关于日期的脏数据问题,主要是因为格式原因,而在项目中存在的日期格式问题,主要有如下几种:
1.时间存在汉字脏数据,如:2023-1-9 星期一,2023-1-9 星期,2023-1-9 至,2023-1-9至2023-1-19
2.时间格式不一致,如:2023-01-09,2023-1-9
3.时间格式存在多余符号,如:2023/01/9/,2023-1-9-,2023.1.9.
4.时间拼接式不统一,如:2023-01-09,2023/01/09,2023.01.09
5.时间拼接格式为汉字,如:2023年1月9日
6.时间内容缺省,如:2023-1,2023年1月,2023/01
7.时间内容与时间规范不匹配,一为大小月问题,一为平闰年二月问题
解决方法
在对于date的处理中,我们采用多次正则匹配替换的方案进行数据处理,最终转换为符合规范的数据。
正则匹配
1,进行汉字脏数据的处理:
REGEXP_REPLACE(BARQ,'(至|星期[一二三四五六七日]|星期','',1);
2,处理时间格式不统一以及存在汉字拼接的处理正则
REGEXP_REPLACE(BARQ_1,'(年|月|日|\.|\-)','/',1);
3,时间格式存在多余符号
REGEXP_REPLACE(BARQ_1,'(\/$)','',1);
4,时间格式存在多余空格符号的处理逻辑
REGEXP_REPLACE(BARQ_1,'\s*','',1);
5,时间平闰年正则处理逻辑
TO_DATE(BARQ_1,'YYYY/MM/DD') WHERE regexp_like(BARQ_1,'(((([0-9]{2})((0[48])|([2468][048])|([3579][26]))|2000)\/(02|2)\/((2[0-9])|(1[0-9])|(0[1-9])|([1-9]))$))|
(^[1-9][0-9]{3}\/(02|2)\/((2[0-8])|(1[0-9])|(0[1-9])|([1-9]))$)');
6,时间为大小月的正则处理逻辑
TO_DATE(BARQ_1,'YYYY/MM/DD') WHERE regexp_like(BARQ_1,'(^[1-9][0-9]{3}\/(01|03|05|07|08|1|3|5|7|8|10|12)\/((3[0-1])|([1-2][0-9])|(0[1-9])|([1-9])))$|(^[1-9][0-9]{3}\/(04|06|09|11|4|6|9)\/((30)|([1-2][0-9])|(0[1-9])|([1-9]))$)');
处理结果
真通过上述各正则进行顺序执行后,date的数据基本转换成为可使用的常规数据,脏数据为17W条,转换后只有不足百条数据的date制空,其中存在诸多如.
,2023-01
等缺省数据。