🚀 Oracle 正则表达式:日期校验
这是一个用于校验日期格式的正则表达式集合,适用于 Oracle SQL。以下正则支持 YYYY-MM-DD 格式(分隔符可替换),并处理闰年等特殊情况。让我们开始吧!📅
📝 正则表达式
1️⃣ 标准日期正则(推荐)
- 分隔符:需将
#替换为实际的时间分隔符(如-、.、(/)。 - 功能:校验
YYYY-MM-DD格式,包含闰年规则。
(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})#(((0[13578]|1[02])#(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)#(0[1-9]|[12][0-9]|30))|(02#(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))#02#29)
规则说明:
- 年份:
0001-9999。 - 月份:
- 31 天:
01、03、05、07、08、10、12。 - 30 天:
04、06、09、11。 - 2 月:平年
1-28,闰年1-29。
- 31 天:
- 闰年:能被 4 整除且不被 100 整除,或能被 400 整除。
示例(分隔符为 -):
- 有效:
2023-05-15、2000-02-29(闰年)。 - 无效:
2023-02-29(非闰年)、2023-04-31。
2️⃣ 废弃案例(19xx-20xx)
- 分隔符:需将
XXX替换为实际的时间分隔符。 - 限制:仅支持 19xx 和 20xx 年份,已废弃。
^((((19|20)\d{2})XXX(0?(1|[3-9])|1[012])XXX(0?[1-9]|[12]\d|30))|(((19|20)\d{2})XXX(0?[13578]|1[02])XXX31)|(((19|20)\d{2})XXX0?2XXX(0?[1-9]|1\d|2[0-8]))|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))XXX0?2XXX29))$
⚠️ 缺点:年份范围窄,不推荐使用。
🔧 SQL 示例
使用正则校验日期
以下 SQL 使用 regexp_like 判断日期是否有效(以 - 为分隔符):
select case when regexp_like('2004-02-32','^((((19|20)\d{2})-(0?(1|[3-9])|1[012])-(0?[1-9]|[12]\d|30))|(((19|20)\d{2})-(0?[13578]|1[02])-31)|(((19|20)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))-0?2-29))$') then 1 else 0 end from dual;
✅ 结果:
0(2004-02-32无效,2004 非闰年,2 月最多 29 天)。
测试用例:
2023-05-15→1(有效)。2000-02-29→1(有效,闰年)。2023-02-29→0(无效,非闰年)。
🌟 使用技巧
- 替换分隔符:将正则中的
#或XXX替换为实际分隔符(如-、.)。 - 调试:用
regexp_like测试日期字符串,结合case返回 0/1。 - 简化:若无需闰年校验,可用更简单的正则(如
[0-9]{4}-[0-1][0-9]-[0-3][0-9]),但精度较低。
评论区