Sql Oracle使用REGEXP验证日期字段

Sql Oracle使用REGEXP验证日期字段,sql,regex,oracle11g,Sql,Regex,Oracle11g,我使用的是Oracle 11G,我有一个日期列Var char 2,其中日期是手动输入到数据库中的,不幸的是,很多时候输入的日期无效。我只想使用某种类似REGEXP的语句选择有效的日期字段。下面是我想要选择的可能的有效格式 DATE JULY 31, 2009 7/31/2009 31-JUL-09 我不想选择这三种可能的格式之外的任何内容。有人能帮我想出一个REGEXP或其他方法来选择这些有效的日期格式吗。提前感谢。尝试PL/SQL而不是正则表达式。它将大大降低速度,但更安全,更易于维护和

我使用的是Oracle 11G,我有一个日期列Var char 2,其中日期是手动输入到数据库中的,不幸的是,很多时候输入的日期无效。我只想使用某种类似REGEXP的语句选择有效的日期字段。下面是我想要选择的可能的有效格式

DATE

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

我不想选择这三种可能的格式之外的任何内容。有人能帮我想出一个REGEXP或其他方法来选择这些有效的日期格式吗。提前感谢。

尝试PL/SQL而不是正则表达式。它将大大降低速度,但更安全,更易于维护和扩展。 您应该依靠Oracle格式模型来正确地执行此操作。我见过很多人试图用正则表达式验证这些信息,但是 我很少看到它做得正确

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

代码和测试用例:

简单性能测试:


为什么日期应该保存为日期而不是文本,这是一个很好的理由。您是否要求我们为您编写类似REGEXP_的语句?这不是什么问题,这是你可以自己解决的,对吧?你已经知道你需要像REGEXP_一样使用REGEXP_,所以别偷懒了,写一个吧。Scotch如果我知道如何在一个REGEXP_中为所有三种格式编写REGEXP,就像我自己会做一样,但我似乎无法让它工作。谢谢你的帮助…@Swingard我不是想做一个混蛋-在我看来,你已经知道该做什么了,你只是想有人帮你做-这有点违反规则。因此,看起来您可以编写三个regexp并使用或使用一个非regexp-like来拒绝特定的公共脏数据
--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;