为什么ORACLE TO_DATE()
函数可以接收任何日期格式?像
insert into testtest values (to_date('2015-09-22 23:19:00','YYYY-MM-DD HH24:MI:SS'));
insert into testtest values (to_date('20150923 23:20:00','YYYY-MM-DD HH24:MI:SS'));
insert into testtest values (to_date('20150927233001','YYYY-MM-DD HH24:MI:SS'));
insert into testtest values (to_date('20150925','YYYY-MM-DD HH24:MI:SS'));
这些都是正确的。
答案 0 :(得分:1)
ORACLE TO_DATE()函数可以接收上述示例原因
的任何日期格式格式模型是一种字符文字,用于描述存储在字符串中的日期时间或数字数据的格式。格式模型不会更改数据库中值的内部表示形式。将字符串转换为日期或数字时,格式模型将确定Oracle数据库如何解释字符串。 参考:https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements004.htm#SQLRF00210
当日期转换失败时,Oracle尝试使用某些类似的格式尝试成功。在Oracle 8i之前,在这个问题上存在一些问题,但现在Oracle在日期函数或日期字符串后面有一个强大的机制。
此表位于SQL Reference
的Format Model部分答案 1 :(得分:1)
正如@Famous所说,默认 Oracle会尝试各种格式来尝试解释字符串as noted in the documentation:
Oracle数据库将字符串转换为具有一定灵活性的日期。例如,当使用
TO_DATE
函数时,包含标点符号的格式模型匹配缺少部分或全部这些字符的输入字符串,前提是输入字符串中的每个数字元素都包含允许的最大位数 - 例如,“MM”的两位数字“05”或“YYYY”的四位数“2007”。
但你可以改变这种行为with the FX
format modifier:
<强> FX 强>
格式准确。此修饰符指定
TO_DATE
函数的字符参数和日期时间格式模型的精确匹配:
字符参数中的标点符号和引用文本必须与格式模型的相应部分完全匹配(例外情况除外)。
字符参数不能有额外的空格。如果没有
FX
,Oracle会忽略额外的空白。字符参数中的数字数据必须与格式模型中的相应元素具有相同的位数。如果没有
FX
,则字符参数中的数字可以省略前导零 启用FX
后,您也可以使用FM修饰符禁用对前导零的检查。如果角色参数的任何部分违反任何这些条件,则Oracle会返回错误消息。
因此,如果添加该修饰符:
insert into testtest values (to_date('2015-09-22 23:19:00','FXYYYY-MM-DD HH24:MI:SS'));
insert into testtest values (to_date('20150923 23:20:00','FXYYYY-MM-DD HH24:MI:SS'));
insert into testtest values (to_date('20150927233001','FXYYYY-MM-DD HH24:MI:SS'));
insert into testtest values (to_date('20150925','FXYYYY-MM-DD HH24:MI:SS'));
然后第一个语句仍然有效,但其他三个语句都会出错:
ORA-01861: literal does not match format string