insert into mytable values('10AUGUST2016年); ////reason not understandable . W& T3 X4 X- x+ q# ^
此外,我没有在这里使用任何东西TO_DATE函数,我猜隐式转换正在发生? & y0 {( a& ~- G' Y' I 1 |$ F) d3 @6 T7 U9 y, M2 E* r 解决方案: # {3 i7 G3 K) J8 Z
字符串到日期转换规则允许额外的格式规则(没有其他修改)。) [+ F2 ~0 M- _; J MM也匹配MON和MONTH;1 n1 S' c P2 v' J
MON匹配MONTH(反之亦然);9 ~! \; ^. f3 L0 [" r
RR匹配RRRR; 和 c" o5 o- t. e
可选标点符号。所以:! f8 k- K# Y' }
SELECT TO_DATE( '10AUGUST2016','DD-MM-RR ) FROM DUAL UNION ALLSELECT TO_DATE( '10AUGUST2016','DD-MON-RR ) FROM DUAL UNION ALLSELECT TO_DATE( '10AUGUST2016','DD-MONTH-RR' ) FROM DUAL UNION ALLSELECT TO_DATE( '10AUG DD-MM-RR ) FROM DUAL UNION ALLSELECT TO_DATE( '10AUG DD-MON-RR ) FROM DUAL UNION ALLSELECT TO_DATE( '10AUG DD-MONTH-RR' ) FROM DUAL;- ]. G9 v3 `1 S# Q2 ^) o, E
2016年所有生成日期-08-10T00:00:00。+ n7 X9 s5 M6 L; B8 ^; R8 G
使用格式模型可以防止这种情况FX! N. b% G* h9 Q' z6 `1 N
外汇格式准确。本修改符指定函数的字符参数与日期时间格式模型的准确匹配TO_DATE:8 z+ M1 r, ~3 J$ Y 字符参数中的标点符号和引用文本必须与格式模型的相应部分完全匹配(大小写除外)。 6 N" C; g. i! v$ s/ p字符参数不能有多余的空间。如果没有FX,Oracle 会忽略额外的空间。' k* F; Y" c- h% v) H
字符参数中的数字数据必须与格式模型中的相应元素具有相同的位数。如果没有FX,前导零可以省略字符参数中的数字。0 v* Y2 B4 N" Q+ x8 U 当FX启用时,您可以使用禁用此检查的前导零FM修改为好。 a3 L# I$ C8 E; A f
如果字符参数的任何部分违反了这些条件中的任何一个, Oracle 将返回错误消息。 4 Z) L* d2 H& e% X2 G% k然后:1 F' f, O5 m5 k) s
SELECT TO_DATE( '10-AUGUST-2016','FXDD-MM-RR ) FROM DUAL; ; q6 S" v }9 ^0 a# x: s7 Q
Gives: ORA-01858: a non-numeric character was found where a numeric was expectedand 只能匹配找到精确模式匹配的地方(尽管RR仍会匹配RRRR)。, y* C% V/ N3 j3 v7 K
我猜隐式转换正在发生?3 H4 G9 B0 H0 j
是的,oracle 隐式地TO_DATE( '10AUGUST2016',NLS_DATE_FORMAT )用于转换。' p) ~) F. h+ e1 e
若使用:6 V3 Z2 R% _# a
ALTER SESSION SET NLS_DATE_FORMAT = 'FXDD-MM-RR'; p( U( o2 j5 B