先需要判断表中的以varchar2 类型存的时间,是否正确。我想到的方法就是用正则表达式来判断。
select case when regexp_like('20191111','^((((1|2|3)\d{3})(0[13578]|1[02])(0[1-9]|[12]\d|3[01]))|(((1|2|3)\d{3})(0[469]|11)(0[1-9]|[12]\d|30))|(((1|2|3)\d{3})02(0[1-9]|1\d|2[0-8]))|((((1|2|3)/d([13579][26]|[2468][048]|0[48]))|(1000)|(2000)|(3000))02(0[1-9]|[12]\d)))$') then 1 else 0 end from dual;
正则表达式解释:
(((1|2|3)\d{3})(0[13578]|1[02])(0[1-9]|[12]\d|3[01])) 1000年到3999年的1,3,5,7,8,10,12月,即到31号的月份
(((1|2|3)\d{3})(0[469]|11)(0[1-9]|[12]\d|30)) 1000年到3999年的4,6,9,11月,即到30号的月份
(((1|2|3)\d{3})02(0[1-9]|1\d|2[0-8])) 1000年到3999年的2月,所有的2月都到28号
((((1|2|3)/d([13579][26]|[2468][048]|0[48]))|(1000)|(2000)|(3000))02(0[1-9]|[12]\d)) 1000年到3999年中的闰年,2月有29号