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

时间:2017-05-03 10:32:24

标签: sql oracle date oracle11g

我检查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函数,我想隐式转换正在进行?

1 个答案:

答案 0 :(得分:4)

String-to-Date Conversion Rules允许其他格式规则(不应用任何其他修饰符)。所以:

  • 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 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';

然后你的插入会失败。