我需要帮助形成一个日期的正则表达式以匹配YYYYMMDD格式。以下是详细信息:
输入验证:输入的值是8的长度和所有数字。该 第一个字符是1或2.第5个和第2个字符。第6个字符在01到12之间, 最后两个字符介于01和31之间
我在下面的表达式中尝试了它,但无法理解我们如何提供数值范围,例如1-12个月和1-31天。
SELECT 'P' from dual where REGEXP_LIKE ('122412','^[1][2][0-9]{2}[1|12]$');
提前致谢!
答案 0 :(得分:6)
这是一个坏主意。验证日期正确的 only 方法是尝试将其转换为日期。如果转换失败,那么它不是日期;如果它成功了,那么可能。日期过于复杂,无法解析常规语言。
因此,创建一个将其转换为日期的函数;你可以制作比你在这里更通用的东西,所以它可以重复用于其他目的:
create or replace function validate_date (
PDate in varchar2
, PDateFormat in varchar2
) return date is
begin
return to_date(PDate, PDateFormat);
exception when others then
return null;
end;
如果它能够验证日期和日期格式是否匹配,则返回日期,否则如果有任何错误则返回NULL。您的查询将变为:
select 'P' from dual where validate_date('20140506', 'yyyymmdd') is not null
答案 1 :(得分:4)
示例:
^[12][0-9]{3}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])$
警告强>
使用正则表达式并不是一个好主意,因为它会传递无效值,如20140229
,20140431
等。检查@ Ben的答案是否正确。
如果您想验证日期时间,并且无法像在@Ben的答案中那样在Oracle中创建功能(没有访问权限/权限)
然后您可以使用以下查询:
SELECT 'P'
FROM DUAL
WHERE REGEXP_LIKE ('20140229','^[12][0-9]{3}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])$')
AND '20140229' <= TO_CHAR(LAST_DAY(TO_DATE(SUBSTR('20140229', 1, 6) || '01', 'YYYYMMDD')), 'YYYYMMDD');
您确实用列名替换20140229
。