我有下面的匿名街区。我写了一个小正则表达式来接受这个日期。它能够验证日期、月份和年份。现在我想考虑唯一的世纪年,regexp还应该允许rr格式的年(世纪年)。另外,我想接受前缀中没有零的一天;目前,它只接受这个月。请参见以下场景:
> 01/12/2154 (Do not accept, It's not a century year)
> 11/12/1996 (Do not accept, It's not a century year)
> 11/2/24 (Accept, and a plsql logic in IF condition could change it to 2024; Add 20 to it)
> 1/9/2020 (Accept)
> 01/02/2020 (Accept)
> 1/29/20 (Accept)
> 01/11/25 (Accept)
> 1/09/2021 (Accept)
**
declare
date_v varchar2(40):= '01/01/2025';
date_n date;
begin
if regexp_like (date_v, '([0-9]|1[0-2])/([0-2][0-9]|3[0-1])/[0-9]{4}') then
-- logic
date_n:= TO_DATE(date_v,'MM/DD/YYYY');
dbms_output.put_line(date_n);
end if;
end;
4条答案
按热度按时间cbeh67ev1#
oracle非常聪明,可以识别日期格式中有无0的字符串。
所以你可以直接把这个字符串转换成
TO_DATE('11/2/24', 'mm/dd/rrrr')
为了认识当前的世纪,你可以使用TRUNC
使用'CC'
具体如下:使用上个世纪的另一个日期查询的结果:
注意:我用过
'rrrr'
将任何两位数的年份转换为1950-2049年的年份。q3aa05252#
可以对日期执行正则表达式,但这不是检查日期是否有效的好方法,它只检查格式是否正确。例如,2020年2月30日将通过您的正则表达式,但这不是一个有效的日期。数据库可以替你做这项工作。我通常用这样的方法:
注意,只有当tou date返回ora-01839:date对于指定的月份无效时,它才会失败,您可以很容易地添加其他可能的错误,或者在其他人返回'n'时使用a;
rqcrx0a63#
试试这个:
请参阅此链接:
oracle中日期的正则表达式
xxls0lw84#
使用正则表达式进行日期验证非常困难。问题是月份的天数不同,2月29日只在某些年份有效。您的请求是具有多个有效格式。
以下函数验证iso-8601格式(yyyy-mm-dd)的日期,并且仅验证该格式的日期,但它确实验证从0001-01-01到9999-12-31的每个月的正确天数,包括有效的闰日(2月29日)。但同样只有一种格式。建议不要尝试用正则表达式(尤其是多种格式)验证日期。