数据验证在oracle中

时间:2015-02-13 19:55:45

标签: regex oracle date

你好像oracle中的表一样

ID          NAME      STARTDATE
1           A         2014-01-01
2           B         1900-01-01
3           C         29-02-2016

这里执行选择查询时,我想要进行数据验证,检查年份在1900-2099月1日到12日之间,日期在1-31之间。 我尝试通过在查询中使用正则表达式来获得此结果

SELECT *
FROM   test
WHERE  REGEXP_LIKE (
          startdate,
          '^(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$')

它工作正常但是在案例31-02-2016失败的情况下,我试图使用另一个表达式,在此链接中给出 Regex to validate date format dd/mm/yyyy

但它在执行查询时未显示找到的数据, 正则表达式的oracle是否有任何限制,因为相同的表达式在此http://regexr.com/

上正常工作

1 个答案:

答案 0 :(得分:1)

我不知道执行此操作的函数,但您可以使用to_date创建一个验证特定格式的函数。例如:

create or replace function test_date_func(d varchar2,format varchar2) return varchar2
is
  v_date date;
begin
  select to_date(d,format) into v_date from dual;
  return '1';
  exception when others then return '0';
end;

现在您可以多次调用该函数:

select dat, test_date_func(dat,'dd-mm-yyyy')||test_date_func(dat,'yyyy-mm-dd') valid 
from (select '2014-01-01' dat from dual union all
select '1900-01-01' from dual union all
select '29-02-2010' from dual union all
select '28-02-2010' from dual);

以格式'dd-mm-yyyy'和'yyyy-mm-dd'验证日期并返回:

DAT     VALID
2014-01-01   01
1900-01-01   01
29-02-2010   00
28-02-2010   10

如您所见,唯一无效日期为29-02-2010,在00两种情况下都返回0。现在,如果你想要更清楚,你可以添加一个案例条件来显示有效或无效而不是0和1:

select dat, case when regexp_like(valid,'1') then 'Valid' else 'Invalid' end from ( 
select dat, test_date_func(dat,'dd-mm-yyyy')||test_date_func(dat,'yyyy-mm-dd') valid 
from (select '2014-01-01' dat from dual union all
select '1900-01-01' from dual union all
select '29-02-2010' from dual union all
select '28-02-2010' from dual));