T.Z*_*.Z. 15 sql oracle oracle12c
我在使用format_mask参数时发现了oracle TO_DATE函数的奇怪行为.
基本上,我看到的是,在一种情况下,它忽略给定的格式掩码,并使用自己的掩码解析输入,在其他情况下,它会抛出异常.
示例I预期行为 - 抛出错误:
SELECT TO_DATE('18-02-2016', 'DD/MON/YYYY') FROM dual
Run Code Online (Sandbox Code Playgroud)
ORA-01843:不是有效月份
示例II意外行为 - 解析日期:
SELECT TO_DATE('18-feb-2016', 'DD/MM/YYYY') FROM dual
Run Code Online (Sandbox Code Playgroud)
2016年2月18日00:00:00
我在文档中看不出任何这样的评论,所以我想知道这种不妥之处是设计还是错误或者我不理解正确的事情?
编辑: 看看答案我可以同意它很可能是设计的.但是在这里所做的事情对我来说是危险的"自动化".
如果格式将被错误地解释(由oracle猜测)怎么办?有没有关于这里究竟发生了什么的文件,所以我可以肯定它是安全的吗?
我的问题是 - 我可以把它关掉吗?我唯一的选择是自己验证格式吗?
gmi*_*ley 18
请参阅此处的表格:https://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements004.htm#g195479
它是Datetime格式模型的String-To-Date Conversion Rules部分.在的情况下,MM如果没有匹配,它试图为MON和MONTH.同样,如果您指定MON但未找到,则尝试MONTH.如果你指定MONTH并且找不到它,它会尝试MON,但它永远不会尝试MM任何除外MM.
回答这个问题:Can I turn it off?答案是肯定的.
您可以通过指定FX格式的一部分来实现.
SELECT TO_DATE('18/february/2016', 'FXDD/MM/YYYY') FROM dual;
Run Code Online (Sandbox Code Playgroud)
现在返回:
[错误]执行(4:16):ORA-01858:找到一个非数字字符,其中数字是预期的
以下内容:
SELECT TO_DATE('18/02/2016', 'FXDD/MM/YYYY') FROM dual;
Run Code Online (Sandbox Code Playgroud)
返回预期的:
2016年2月18日
请注意,在指定FX时必须使用正确的分隔符,否则会出错.