你好像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/
上正常工作答案 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));