当使用
format_mask参数时,我刚刚发现oracle
TO_DATE功能的好奇行为.
基本上,我看到的是,在一种情况下,它会忽略给定的格式掩码,并使用自己的掩码来解析输入,在其他情况下会抛出异常.
示例我预期的行为 – 抛出的错误:
SELECT TO_DATE('18-02-2016','DD/MON/YYYY') FROM dual
ORA-01843: not a valid month
示例II意外行为 – 解析日期:
SELECT TO_DATE('18-feb-2016','DD/MM/YYYY') FROM dual
February,18 2016 00:00:00
我在文档中看不到任何这样的说法,所以我想知道这个incostincency是否是设计的,还是错误的,或者我不明白什么是正确的?
编辑:
看着答案我可以同意,这最有可能是设计.但是,这里所做的工作对我而言是危险的“自动化”.
格式如何解释(oracle猜测)不正确?有没有关于这里正在发生的事情的文件,所以我可以确定它是安全的?
我的问题是 – 我可以把它关掉吗?我唯一的选择是否自行验证格式?
解决方法
见表:
https://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements004.htm#g195479
它是日期时间格式模型的字符串日期转换规则部分的一部分.在MM的情况下,如果没有匹配,则尝试MON和MONTH.类似地,如果您指定MON并且没有找到,则尝试MONTH.如果你指定MONTH并且找不到它,它会尝试MON,但是除了MM之外,它不会尝试MM.
回答这个问题:我可以把它关掉吗?答案是,是的.
您可以通过将FX指定为格式化的一部分来实现.
SELECT TO_DATE('18/february/2016','FXDD/MM/YYYY') FROM dual;
现在返回:
[Error] Execution (4: 16): ORA-01858: a non-numeric character was
found where a numeric was expected
而以下内容:
SELECT TO_DATE('18/02/2016','FXDD/MM/YYYY') FROM dual;
返回预期:
2/18/2016
请注意,当指定FX时,您必须使用适当的分隔符,否则将会出错.