我检查NLS_DATE_FORMAT
时是DD-MM-RR
。
考虑到带有日期列的mytable,当我执行以下语句时,它会抛出错误" ORA-01840:输入值不够长,不适合日期格式"这是合理可以理解的。
insert into mytable values('10'); //Error: reason understandable
那么为什么以下语句在输入大小大于默认值DATE Format
的情况下有效。
insert into mytable values('10AUGUST2016'); //reason not understandable
另外在这里我没有使用任何TO_DATE
函数,我想隐式转换正在进行?
答案 0 :(得分:4)
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
FX
格式准确。此修饰符指定
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';
然后你的插入会失败。