正则表达特定的日期格式

时间:2014-05-06 19:16:33

标签: regex oracle

我需要帮助形成一个日期的正则表达式以匹配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]$');

提前致谢!

2 个答案:

答案 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])$

Regular expression visualization

Debuggex Demo

警告

使用正则表达式并不是一个好主意,因为它会传递无效值,如2014022920140431等。检查@ 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