在不使用函数的情况下在Oracle中验证日期

时间:2014-08-03 13:19:22

标签: sql oracle

我是Oracle的新手。我必须在oracle数据库的表中的列中选择无效日期。但由于在数据库中拥有只读权限,我也无法编写函数。 任何人都可以帮助编写简单查询以在列中选择无效日期:

e.g。从表格中选择日期,to_date(日期'yyyy / mm / dd')

在上面的查询中,如果日期不是有效格式,则会出错。但不是错误,我必须输出该日期。我们可以在简单查询中完成吗?

2 个答案:

答案 0 :(得分:1)

您可以使用正则表达式测试格式。

这将是:

select dates
from tbl
where regexp_like(dates, '[[:digit:]]{4}/[[:digit:]]{2}/[[:digit:]]{2}')

这没关系。它检查格式是否为" 4位数/ 2位数/ 2位数"。您可能想要更强大的东西,例如:

select dates
from tbl
where regexp_like(dates, '[[:digit:]]{4}/[[:digit:]]{2}/[[:digit:]]{2}') or
      (substr(dates, 1, 4) not between '1900' and '2014' or
       substr(dates, 6, 2) not between '01' and '12' 
       substr(dates, 9, 2) not between '01' and '31'
      )

这将检查每列中的格式和合理值。当然,它不会检查6月31日,但会发现很多错误。

答案 1 :(得分:0)

您可以尝试:

select *
from tbl
where not regexp_like (dtstring,'^[[:digit:]{4},/,[:digit:]{2},/,[:digit:]{2}]')

小提琴: http://sqlfiddle.com/#!4/c7da3/11/0

将显示任何非4位数字,后跟斜线,2位数字,后跟斜线,后跟2位数字。

然而,它不会检查匹配该格式的值是否无效,即。 2012/23/99