目 录CONTENT

文章目录

Oracle 正则表达式:日期校验

BKUN
2021-11-13 / 0 评论 / 0 点赞 / 2,302 阅读 / 717 字

🚀 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)

规则说明:

  1. 年份0001-9999
  2. 月份
    • 31 天:01、03、05、07、08、10、12
    • 30 天:04、06、09、11
    • 2 月:平年 1-28,闰年 1-29
  3. 闰年:能被 4 整除且不被 100 整除,或能被 400 整除。

示例(分隔符为 -):

  • 有效:2023-05-152000-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;

结果02004-02-32 无效,2004 非闰年,2 月最多 29 天)。

测试用例:

  • 2023-05-151(有效)。
  • 2000-02-291(有效,闰年)。
  • 2023-02-290(无效,非闰年)。

🌟 使用技巧

  1. 替换分隔符:将正则中的 #XXX 替换为实际分隔符(如 -.)。
  2. 调试:用 regexp_like 测试日期字符串,结合 case 返回 0/1。
  3. 简化:若无需闰年校验,可用更简单的正则(如 [0-9]{4}-[0-1][0-9]-[0-3][0-9]),但精度较低。
0

评论区