小编典典

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

sql

当我检查我的NLS_DATE_FORMATDD-MM-RR.

考虑到带有日期列的 mytable,当我执行以下语句时,它会抛出错误“ORA-01840:日期格式的输入值不够长”,这是可以理解的。

insert into mytable values('10'); //Error: reason understandable

那么为什么下面的语句在输入大小明显大于 default 大小的情况下有效DATE Format

insert into mytable values('10AUGUST2016'); //reason not understandable

另外这里我没有使用任何TO_DATE函数,我猜隐式转换正在发生?


阅读 635

收藏
2021-07-02

共1个答案

小编典典

字符串到日期转换规则允许额外的格式规则(没有任何其他修饰被施加)。所以:

  • MM也匹配MONMONTH;
  • 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

外汇

格式准确。此修饰符指定函数的字符参数和日期时间格式模型的精确匹配TO_DATE

  • 字符参数中的标点和引用文本必须与格式模型的相应部分完全匹配(大小写除外)。

  • 字符参数不能有多余的空格。如果没有FX,Oracle 会忽略额外的空格。

  • 字符参数中的数字数据必须与格式模型中的相应元素具有相同的位数。如果没有FX,字符参数中的数字可以省略前导零。

FX启用时,您可以通过使用禁用此检查的前导零FM修改为好。

如果字符参数的任何部分违反了这些条件中的任何一个,则 Oracle 将返回一条错误消息。

然后:

SELECT TO_DATE( '10-AUGUST-2016', 'FXDD-MM-RR'    ) FROM DUAL;

Gives: ORA-01858: a non-numeric character was found where a numeric was expectedand 只会匹配找到精确模式匹配的地方(尽管RR仍会匹配RRRR)。

我猜隐式转换正在发生?

是的,oracle 隐式地TO_DATE( '10AUGUST2016', NLS_DATE_FORMAT )用于进行转换。

如果您使用:

ALTER SESSION SET NLS_DATE_FORMAT = 'FXDD-MM-RR';

那么你的插入就会失败。

2021-07-02