2

我有 excel 文件,其中包含日期字段中的一些垃圾数据。

日期格式为 1/2/2015 格式。我正在尝试将该文件加载到 varchar 字段中的阶段表中,并在加载到主表之前应用正则表达式替换函数来清理坏数据

我可以为我提供合适的表达吗

create table A
(
bad_date varchar2(4000)
);

insert into A
( bad_date)
values ('1/2/2005');
insert into A
( bad_date)
values ('indep');
insert into A
( bad_date)
values ('/');

commit;


 create table B
    (
    good_date date
    );

我想使用正则表达式函数来清理不在日期模式中的数据。谢谢你的帮助!

4

4 回答 4

3

Use ^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4} pattern for regexp_like conforming your date format.

Use the following insert statement to get clean date data :

insert into B
select * from
( select to_date(bad_date,
           case when 
             regexp_like(bad_date,'^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}') then 
             'DD/MM/YYYY'
           end) dateConverted          
    from A)
where dateConverted is not null;    

SQL Fiddle Demo

于 2018-05-31T02:29:27.573 回答
3

使用以下内容:

INSERT INTO B (GOOD_DATE)
  SELECT TO_DATE(BAD_DATE, 'DD/MM/YYYY')
    FROM A
    WHERE REGEXP_LIKE(BAD_DATE, '[0-9]+/[0-9]+/[0-9]+')

SQLFiddle在这里

祝你好运。

于 2018-05-30T23:21:14.790 回答
3

您可以通过以下方式接近:

select (case when regexp(bad_date, '^[0-1]?[0-9]/[0-3]?[0-9]/[0-9]{4}$')
             then to_date(bad_date, 'MM/DD/YYYY'
        end) as converted_date
于 2018-05-30T23:16:46.943 回答
2

我倾向于贡献一个更成熟的正则表达式来匹配m/d/yyyy格式的有效日期:

INSERT INTO B (GOOD_DATE)
  SELECT TO_DATE(BAD_DATE, 'DD/MM/YYYY')
    FROM A
    WHERE REGEXP_LIKE(BAD_DATE,
            '^(0?[1-9]|[12][0-9]|3[01])\/(0?[1-9]|1[012])\/(19|20)[0-9][0-9]$'
    )

SQLFiddle

灵感来自

于 2018-05-31T02:07:41.183 回答