为啥 ORACLE TO_DATE() 函数可以接收任何日期格式? [复制]

Posted

技术标签:

【中文标题】为啥 ORACLE TO_DATE() 函数可以接收任何日期格式? [复制]【英文标题】:Why ORACLE TO_DATE() function can receive any date format? [duplicate]为什么 ORACLE TO_DATE() 函数可以接收任何日期格式? [复制] 【发布时间】:2018-02-14 10:05:37 【问题描述】:

为什么ORACLETO_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')); 

这些都是正确的。

【问题讨论】:

【参考方案1】:

ORACLE TO_DATE() 函数可以接收上述示例原因的任何日期格式

格式模型是一种字符文字,它描述了存储在字符串中的日期时间或数字数据的格式。格式模型不会更改数据库中值的内部表示。将字符串转换为日期或数字时,格式模型确定 Oracle 数据库如何解释字符串。 参考:https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements004.htm#SQLRF00210

当日期转换失败时,Oracle 会尝试一些类似的格式来尝试成功。在 Oracle 8i 之前在这个问题上存在一些问题,但是现在 Oracle 在日期函数或日期字符串背后有一个强大的机制。

此表位于 SQL 参考的“格式模型”部分中

原始格式元素 如果原始格式失败,要尝试的其他格式元素

参考:http://www.oracledba.co.uk/tips/dates_8i.htm

【讨论】:

【参考方案2】:

正如@Famous 所说,默认情况下Oracle 会尝试各种格式来尝试解释字符串as noted in the documentation:

Oracle 数据库以一定的灵活性将字符串转换为日期。例如,当使用TO_DATE 函数时,包含标点字符的格式模型匹配缺少部分或全部这些字符的输入字符串,前提是输入字符串中的每个数字元素都包含允许的最大位数——例如,两个'MM' 用数字 '05' 或 'YYYY' 用四位数字 '2007'。

但你可以改变这种行为with the FX format modifier:

外汇

格式准确。此修饰符指定 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

【讨论】:

以上是关于为啥 ORACLE TO_DATE() 函数可以接收任何日期格式? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

oracle,插入数据,to_date('13-JUL-87')-51为啥提示“无效的月份”?

Oracle to_date()函数的用法

当结果已被过滤以匹配我的日期格式(Oracle SQL)时,为啥这个 to_date 不起作用

为啥我的 oracle to_date 返回此错误 ORA-01861: literal does not match format string

使用 to_date oracle 函数使用星期数和天数 oracle

关于Oracle中to_date的用法