回答

收藏

无法理解值如何隐式转换为日期格式

技术问答 技术问答 324 人阅读 | 0 人回复 | 2023-09-12

当我检查我的时候NLS_DATE_FORMAT是DD-MM-RR.
6 U% z* B+ G, s. u5 o* A7 D* D考虑到带有日期列的 mytable,当我执行以下句子时,它会抛出错误ORA-可以理解的是,日期格式的输入值不够长。
2 j! X, L& I3 C$ `/ W9 G
    insert into mytable values(10)Error: reason understandable
    ) y, ]" R) i3 G2 i/ @; z7 g- H
那么为什么输入大小明显大于 default 大小有效DATE Format。" _6 O; T% @7 \1 E
    insert into mytable values('10AUGUST2016年); ////reason not understandable
    0 R; a! Z2 B0 b% N$ H/ E
此外,我没有在这里使用任何东西TO_DATE函数,我猜隐式转换正在发生?
, x% x. D! o  A6 \' w                                                                + \$ I, O' U& j: ^
    解决方案:                                                                , H4 X& q' |) Z& I( B9 O& Q
                                                                字符串到日期转换规则允许额外的格式规则(没有其他修改)。/ G, W6 V/ A9 ?; N, }
MM也匹配MON和MONTH;6 ~5 {" b" m0 \( n0 K0 Q4 d
MON匹配MONTH(反之亦然);7 S5 l* r- E% s: U8 v7 O5 J
RR匹配RRRR; 和. d/ c7 j( l! }% c* n
可选标点符号。
所以:
7 o4 ^- b1 w. {: a9 X! ?
    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;
    2 c; Q& Y5 x1 p1 l2 \- J1 O
2016年所有生成日期-08-10T00:00:00。
" G: D, e8 G, m8 |8 G/ G- B2 V* @使用格式模型可以防止这种情况FX. `  t# n/ H- u2 Z5 [
外汇格式准确。本修改符指定函数的字符参数与日期时间格式模型的准确匹配TO_DATE:
" O  X7 {& _, v" {4 ~; j# x字符参数中的标点符号和引用文本必须与格式模型的相应部分完全匹配(大小写除外)。/ D" `; e9 ~4 R) T5 [% O& a
字符参数不能有多余的空间。如果没有FX,Oracle 会忽略额外的空间。6 V: J3 d. [/ t2 t7 L- y2 c, `' [
字符参数中的数字数据必须与格式模型中的相应元素具有相同的位数。如果没有FX,前导零可以省略字符参数中的数字。0 Y9 @  h( ?+ [4 Q
当FX启用时,您可以使用禁用此检查的前导零FM修改为好。$ T0 a, C; h  P( h# R
如果字符参数的任何部分违反了这些条件中的任何一个, Oracle 将返回错误消息。: [6 D* u' G; J2 u2 O
然后:
  E  B  _" `7 H8 a+ W3 r+ [
    SELECT TO_DATE( '10-AUGUST-2016','FXDD-MM-RR    ) FROM DUAL;) j7 d6 x$ C' r* C5 t& D+ r
Gives: ORA-01858: a non-numeric character was found where a numeric was expectedand 只能匹配找到精确模式匹配的地方(尽管RR仍会匹配RRRR)。9 ^2 H3 M/ A: o" U5 [& d
我猜隐式转换正在发生?
+ f  n( o6 [0 Z; U' e" T. o8 [是的,oracle 隐式地TO_DATE( '10AUGUST2016',NLS_DATE_FORMAT )用于转换。
4 m$ m$ E! D; a, y若使用:
! a6 z5 G# n9 @6 c. b
    ALTER SESSION SET NLS_DATE_FORMAT = 'FXDD-MM-RR';2 [0 [6 R0 E; b( X) _3 a
然后你的插入就会失败。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则