我想检查日期是否正确。 (让我们不谈论事实,日期存储在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位数字年份进行检查?
谢谢!
答案 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