String-to-Date Conversion Rules 允许附加格式规则(不应用任何其他修饰符)。所以:
-
MM 也匹配 MON 和 MONTH;
-
MON 匹配 MONTH(反之亦然);
-
RR 匹配 RRRR;和
- 标点符号是可选的。
所以:
SELECT TO_DATE( '10AUGUST2016', 'DD-MM-RR' ) FROM DUAL UNION ALL
SELECT TO_DATE( '10AUGUST2016', 'DD-MON-RR' ) FROM DUAL UNION ALL
SELECT TO_DATE( '10AUGUST2016', 'DD-MONTH-RR' ) FROM DUAL UNION ALL
SELECT TO_DATE( '10AUG2016', 'DD-MM-RR' ) FROM DUAL UNION ALL
SELECT TO_DATE( '10AUG2016', 'DD-MON-RR' ) FROM DUAL UNION ALL
SELECT TO_DATE( '10AUG2016', 'DD-MONTH-RR' ) FROM DUAL;
全部生成日期2016-08-10T00:00:00。
您可以使用FX format model 来防止这种情况发生
外汇
格式准确。此修饰符指定TO_DATE 函数的字符参数和日期时间格式模型的精确匹配:
-
字符参数中的标点和引用文本必须与格式模型的相应部分完全匹配(大小写除外)。
-
字符参数不能有多余的空格。如果没有FX,Oracle 会忽略多余的空格。
-
字符参数中的数字数据必须与格式模型中的相应元素具有相同的位数。如果没有FX,字符参数中的数字可以省略前导零。
启用FX 后,您也可以使用FM 修饰符禁用此前导零检查。
如果字符参数的任何部分违反了这些条件中的任何一个,那么 Oracle 将返回一条错误消息。
然后:
SELECT TO_DATE( '10-AUGUST-2016', 'FXDD-MM-RR' ) FROM DUAL;
给出:ORA-01858: a non-numeric character was found where a numeric was expected,并且只匹配找到精确模式匹配的位置(尽管RR 仍将匹配RRRR)。
我猜隐式转换正在发生?
是的,oracle 隐式使用TO_DATE( '10AUGUST2016', NLS_DATE_FORMAT ) 进行转换。
如果你使用:
ALTER SESSION SET NLS_DATE_FORMAT = 'FXDD-MM-RR';
那么你的插入将失败。