我需要帮助形成一个日期的正则表达式来匹配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)
提前致谢!
这是一个坏主意.验证日期正确的唯一方法是尝试将其转换为日期.如果转换失败,那么它不是日期; 如果它成功那么它可能是.日期过于复杂,无法解析常规语言.
因此,创建一个将其转换为日期的函数; 你可以制作比你在这里更通用的东西,所以它可以重复用于其他目的:
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)
例子:
^[12][0-9]{3}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])$
Run Code Online (Sandbox Code Playgroud)

警告
这不是好主意,使用正则表达式,由于它会通过像无效值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');
Run Code Online (Sandbox Code Playgroud)
您确实20140229用列名替换。
| 归档时间: |
|
| 查看次数: |
7326 次 |
| 最近记录: |