oracle正则判断日期合法性
闲来无事,群友求助写个正则判断日期合法性
数据类似20230201、20231120、20230522。
1、年
判断年份合法的正则表达式为:((19|20)[0-9]{2})
此处前2位固定为19或20,如果有更多需求可以使用 | 正则或符号添加更多,表达式为 (19|20)
3、4位可由00-99,表达式为 [0-9]{2}
2、月日
月份分为3种,有31天的大月,30天的小月以及特殊的2月
大月:1、3、5、7、8、10、12
判断大月月份合法的正则表达式为:(0[13578]|1[02])
判断大月天数合法的正则表达式为:(0[1-9]|[12][0-9]|3[01])
小月:4、6、9、11
判断小月月份合法的正则表达式为:(0[469]|11)
判断小月天数合法的正则表达式为:(0[1-9]|[12][0-9]|30)
2月:分平月28天、闰月29天
平月 (02)(0[1-9]|1[0-9]|2[0-8])
闰月 (02)(0[1-9]|[12][0-9])
通过截取年份模 4 判断当年是平月还是闰月:
case when mod(to_number(substr('20230228',1,4)),4) = 0
then '(19|20)[0-9]{2}(02)(0[1-9]|[12][0-9])'
else '(19|20)[0-9]{2}(02)(0[1-9]|1[0-9]|2[0-8])'
end
将上述年月天表达式组合可得年月日合法正则表达式:
select 1
from dual
where length('20230228') = 8 --限制长度8位
and (regexp_like('20230228','(19|20)[0-9]{2}((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01])|(0[469]|11)(0[1-9]|[12][0-9]|30))')
or regexp_like('20230228',
case when mod(to_number(substr('20230228',1,4)),4) = 0
then '(19|20)[0-9]{2}(02)(0[1-9]|[12][0-9])' --闰年2月29天
else '(19|20)[0-9]{2}(02)(0[1-9]|1[0-9]|2[0-8])' --平年2月28天
end)
)
同理其他类似2023-01-01,2023/01/01型字符串日期在拼接时添加对应间隔符即可。