oracle正则判断日期合法性

本文详细介绍了如何使用Oracle的正则表达式验证日期的合法性,包括年份、月份(区分大小月和闰年2月)、及不同格式的日期处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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  
            and (mod(to_number(substr('20230228',1,4)),100) <> 0 
            or mod(to_number(substr('20230228',1,4)),400) = 0)  --剔除不能被400整除的整百年份
        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 
            and (mod(to_number(substr('20230228',1,4)),100) <> 0 
            or mod(to_number(substr('20230228',1,4)),400) = 0)  --剔除不能被400整除的整百年份
        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型字符串日期在拼接时添加对应间隔符即可。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值