Oracle:当我的格式字符串中有4位数字时,为什么to_date()接受2位数字的年份? -以及如何强制执行4位数字?

时间:2018-11-21 08:09:48

标签: oracle

我想检查日期是否正确。 (让我们不谈论事实,日期存储在varchar中……)

日期的存储方式类似于DDMMYYYY,因此例如24031950是正确的日期。 240319不是。

所以我做到了,当通话有效时,这是正确的日期:

select to_date('24031950','DDMMYYYY') from dual;

但是不幸的是,这也不会返回错误:

select to_date('240319','DDMMYYYY') from dual (why?);

但是有趣的是,这一功能不起作用:

select to_date('190324','YYYYMMDD') from dual;

那么,如何使用给定的格式掩码对4位数字年份进行检查?

谢谢!

3 个答案:

答案 0 :(得分:5)

引用the docs

  

Oracle数据库可以灵活地将字符串转换为日期。 [...]

我相信灵活性就是您所看到的。您可以使用fx修饰符将其关闭:

  

FX:要求字符数据和格式模型之间完全匹配

select to_date('240319','fxDDMMYYYY') from dual;

给出ORA-01862错误。

答案 1 :(得分:4)

只是对Mat的答案的补充说明。 fx就像字符串中的开关一样。

例如TO_DATE('2019-11-5','fxYYYY-MM-DD')给出ORA-01862错误,因为精确匹配适用于整个字符串。如果只需要部分字符串完全匹配,则使用

TO_DATE('2019-11-5','fxYYYY-MM-fxDD')

在这种情况下,YYYY-MM-必须完全匹配,而DD应用灵活(或惰性)匹配。

答案 2 :(得分:1)

要检查其格式是否正确无一例外,您还可以使用正则表达式函数。 一种可能的方法是检查字符串是否包含8位数字:

select REGEXP_INSTR  ('24031950', '[0-9]{8}') from dual;
1


select REGEXP_INSTR  ('240350', '[0-9]{8}') from dual;
0