我是Oracle的新手。我必须在oracle数据库的表中的列中选择无效日期。但由于在数据库中拥有只读权限,我也无法编写函数。 任何人都可以帮助编写简单查询以在列中选择无效日期:
e.g。从表格中选择日期,to_date(日期'yyyy / mm / dd')
在上面的查询中,如果日期不是有效格式,则会出错。但不是错误,我必须输出该日期。我们可以在简单查询中完成吗?
答案 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