oracle正则判断日期合法性

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型字符串日期在拼接时添加对应间隔符即可。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值