目的: 利用日期正则表达式之识别合法日期

工具: regexp_like函数,日期正则表达式

适用范围: 日期格式为 YYYY-MM-DD ,字段类型为 DATE 类型或 varchar2 类型。注:两种字段类型在用法上有些差别,

*
日期正则表达式:是由多个正则表达式组成,识别了1900-01-01至2099-12-30。如果需求其他日期,可以自己添加

^((((19|20)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((19|20)\d{2})-(0?[469]|11)-(0?[1-9]|[12]\d|30))|(((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-(0?[1-9]|[12]\d)))$

正则表达式分段介绍:
第一段:识别1900年至2099年1月、3月、5月、7月、8月、10月、12月中01天-31天。

(((19|20)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))

第二段:识别1900年至2099年4月、6月、9月、11月中的01天-30天

(((19|20)\d{2})-(0?[469]|11)-(0?[1-9]|[12]\d|30))

第三段:识别1900年至2099年02月01天-28天

(((19|20)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))

第四段:识别1900年至2099年中的闰年(2月有29天)

((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))-0?2-(0?[1-9]|[12]\d))
建议可以直接写成,自己理解
((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))-0?2-29)

当字段类型为varchar2时,用法

SELECT c.BIRTHDAY FROM P_C_CI_PERSON c WHERE regexp_like(c.birthday,'^((((19|20)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((19|20)\d{2})-(0?[469]|11)-(0?[1-9]|[12]\d|30))|(((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-(0?[1-9]|[12]\d)))$');

字段类型为DATE时,用法

SELECT  c.IDENT_EXPIRED_DATE 
FROM m_ci_per_identifier c 
WHERE regexp_like(c.IDENT_EXPIRED_DATE,'(((19|20)\d{2})-(0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|(((19|20)\d{2})-(0[469]|11)-(0[1-9]|[12]\d|30))|(((19|20)\d{2})-02-(0[1-9]|1\d|2[0-8]))|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))-02-(0[1-9]|[12]\d))')
                                    日期的格式多种多样,有如:"yyyy-MM-dd HH:mm:ss"、"yyyy/MM/dd HH:mm:ss"、"yyyyMMdd HH:mm:ss"等,当然也有的只记录到天。有的时候需要判断日期格式是否满足特定的格式,正则匹配是比较好的方法。下面罗列了常见日期格式的正则表达式,当前还没有考虑闰年和非闰年的情况。
参考了博客https://blog.csdn.net/gengxiaoming7...
                                    第一步,验证年份
年份范围为 0001 - 9999,匹配YYYY的正则表达式为:
[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}
第二步,验证月份和日期
1. 月份为[1, 3, 5, 7, 8, 10, 12],天数范围为01-31
匹配MM__sep__DD的正则表达式为:
(0[1357...
                                    <br />最简单的正则 如 : /d{4}-/d{2}-/d{2}<br />但是实际情况却不是那么简单,,要考虑,有效性和闰年等问题.....<br />对于日期的有效范围,不同的应用场景会有所不同。MSDN中定义的DateTime对象的有效范围是:0001-01-01 00:00:00到9999-12-31 23:59:59。<br />UNIX时间戳的0按照ISO 8601规范为 :1970-01-01T00:00:00Z。<br />先考虑与年份无关的前三条规则,年份可统一写作<br />(?!0
                                    <br />CREATE OR REPLACE FUNCTION is_date (parmin VARCHAR2)<br /> RETURN NUMBER  IS<br />val DATE;<br /> BEGIN<br /> val := TO_DATE (NVL (parmin, 'a'), 'yyyy-MM-dd');<br />RETURN 1;<br /> EXCEPTION<br />WHEN OTHERS<br />THEN<br /> RETURN 0;<br /> END;
                                    日期正则表达式
描述:完美匹配日期时间的正则表达式,包含yyyy-MM-dd HH:mm:ss 和yyyy/MM/dd HH:mm:ss 两种情况的匹配
日期正则表达式:^((\d{4}(-)\d{1,2}(-)\d{1,2})|(\d{4}(/)\d{1,2}(/)\d{1,2}))(\s)\d{1,2}:\d{1,2}:\d{1,2}$
                                    var reg = /((([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]))))|((([
                                    Oracle中的Like操作符使用'_'和'%'作为通配符,使用就像这样:SELECTnameFROMtest_likeWHEREnamelike'_a%';即匹配test_like表name列中第2个字母是a的所有行。但是注意,Oracle匹配时区分大小写的。也就是说上面的查询时无法查询到name='SAas'这行的。Oracle10g中提供的正则表达式功能可以很好的解决这个问题,当...