select * from table where trunc(value1)=to_date('25-AUG-15','DD-MON-YY');
这很好
select * from table where trunc(value1)=to_date('25-AUG-15','DD-Mon-YY');
虽然有效值应为25-Aug-15
,但也会返回即便如此,
select * from table where trunc(value1)=to_date('25/AUG/15','DD-MON-YY');
结果返回
而且,
select * from table where trunc(value1) = to_date('25-AUG-15', 'DD-MM-YY');
结果返回
但是效果很好
select * from table where trunc(value1) = to_date('25-AUG-15','MMDDYY');
它会检查找不到的月份并返回错误(解析得好!!!)
为什么格式说明符没有对提供的日期值进行严格检查?
感谢。
答案 0 :(得分:3)
这似乎是甲骨文试图让你变得坚实,并且很容易将日期解析为合理的东西。我找不到任何支持这一点的文档,但不仅格式掩码不区分大小写,而且看起来任何非字母数字字符序列都不是输入字符串或格式掩码中出现的控制字符被视为必需的通配符,从Oracle的角度来看:
TO_DATE('17!!!SEP£££15', 'DD$$$MON***YY')
与:
相同TO_DATE('170915', 'DDMONYY')
如果输入中通配符的数量和位置与格式掩码的数量和位置不匹配,您将获得与其正在查找的下一个令牌相关的异常:
TO_DATE('17!!!!SEP-15', 'DD-MON-YY')
ORA-01843: not a valid month
但是,当您查看如何解释格式掩码中的通配符时,它会变得更加奇怪。似乎在令牌之间,任何非字母数字字符序列都被视为单个但可选的通配符,例如:
TO_DATE('17-SEP-15','DD----------------MON-YY')
与:
相同TO_DATE('17-SEP-15','DD-MON-YY')
并且因为格式掩码中的通配符是选项,也具有与以下相同的效果:
TO_DATE('17-SEP-15','DD-MON-YY')