正则表达特定的日期格式

use*_*229 2 regex oracle

我需要帮助形成一个日期的正则表达式来匹配YYYYMMDD格式.以下是详细信息:

输入验证:输入的值是8的长度和所有数字.第一个字符是1或2.第5个和第6个字符在01到12之间,最后两个字符在01和31之间

我尝试了下面的表达式,但无法理解我们如何提供数值范围,如1-12个月和1-31天.

SELECT 'P' from dual where REGEXP_LIKE ('122412','^[1][2][0-9]{2}[1|12]$');
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Ben*_*Ben 6

这是一个坏主意.验证日期正确的唯一方法是尝试将其转换为日期.如果转换失败,那么它不是日期; 如果它成功那么它可能是.日期过于复杂,无法解析常规语言.

因此,创建一个将其转换为日期的函数; 你可以制作比你在这里更通用的东西,所以它可以重复用于其他目的:

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;
Run Code Online (Sandbox Code Playgroud)

如果它能够验证日期和日期格式是否匹配,则返回日期,否则如果有任何错误则返回NULL.您的查询将变为:

select 'P' from dual where validate_date('20140506', 'yyyymmdd') is not null
Run Code Online (Sandbox Code Playgroud)


Ulu*_*rov 5

例子:

^[12][0-9]{3}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])$
Run Code Online (Sandbox Code Playgroud)

正则表达式可视化

调试器演示

警告

这不是好主意,使用正则表达式,由于它会通过像无效值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');
Run Code Online (Sandbox Code Playgroud)

您确实20140229用列名替换。