Oracle使用REGEXP验证日期字段

时间:2013-04-01 01:33:15

标签: sql regex oracle11g

我正在使用Oracle 11G并且我有一个日期列(Var char 2),其中日期被手动输入到数据库中,不幸的是多次输入无效日期。我想只使用某种REGEXP LIKE语句选择有效的日期字段。以下是我想要选择的有效格式。

DATE

JULY 31, 2009
7/31/2009
31-JUL-09

我不想选择的这3种可能格式的东西。有人可以帮我提出一个REGEXP或其他方式来选择这些有效的日期格式。提前谢谢。

1 个答案:

答案 0 :(得分:1)

尝试使用PL / SQL而不是正则表达式。它会明显变慢,但更安全,更容易维护和扩展。 您应该依赖Oracle格式模型来正确执行此操作。我已经看到很多尝试使用正则表达式来验证这些信息,但是 我很少看到它正确完成。

如果您真的关心性能,那么真正的答案就是修复您的数据模型。

代码和测试用例:

--Function to convert a string to a date, or return null if the format is wrong.
create or replace function validate_date(p_string in string) return date is
begin
    return to_date(p_string, 'MONTH DD, YYYY');
exception when others then
    begin
        return to_date(p_string, 'MM/DD/YYYY');
    exception when others then
        begin
            return to_date(p_string, 'DD-MON-RR');
        exception when others then
            return null;
        end;
    end;
end;
/

--Test individual values
select validate_date('JULY 31, 2009') from dual;
2009-07-31
select validate_date('7/31/2009') from dual;
2009-07-31
select validate_date('31-JUL-09') from dual;
2009-07-31
select validate_date('2009-07-31') from dual;
<null>

简单性能测试:

--Create table to hold test data
create table test1(a_date varchar2(1000)) nologging;

--Insert 10 million rows
begin
    for i in 1 .. 100 loop
        insert /*+ append */ into test1
        select to_char(sysdate+level, 'MM/DD/YYYY') from dual connect by level <= 100000;

        commit;
    end loop;
end;
/

--"Warm up" the database, run this a few times, see how long a count takes.
--Best case time to count: 2.3 seconds
select count(*) from test1;


--How long does it take to convert all those strings?
--6 minutes... ouch
select count(*)
from test1
where validate_date(a_date) is not null;