在填充记录字段的表时,无法转换为 VARCHAR



我正在使用 Oracle Database 12c 企业版版本 12.1.0.2.0 - 64 位生产并从 2 个选择语句开始:

select to_char('29.01.2018 00:00:00', 'DD.MM.YYYY HH24:MI:SS') from dual;

与。

select to_char(sysdate, 'DD.MM.YYYY HH24:MI:SS') from dual;

我问为什么第一个选择返回错误:ORA-01722: invalid number

为什么选择1st,为了返回预期的结果需要写成:select to_char(to_date('29.01.2018 00:00:00', 'DD.MM.YYYY HH24:MI:SS')) from dual;

。从这里推断,我还有另外 2 种与第一选择相关的情况:

  1. 当它从记录填充VARCHAR2字段时,它工作得很好。
  2. 当它从记录表中填充VARCHAR2字段时,它会返回上述错误消息?

谢谢

我问为什么第一个选择返回错误:ORA-01722:无效的数字?

to_char()有三个版本,它们采用不同的数据类型参数;一个用于数字,一个用于日期时间,一个用于字符。

如果你只传递了字符串,没有第二个格式模型参数:

to_char('29.01.2018 00:00:00')

然后它将使用char版本而不会抱怨。但是您正在提供第二个参数,因此只有数字和日期时间版本可能有效。

两者都不接受文本文字作为第一个参数。但 Oracle 通常会尝试提供帮助,并允许大量隐式转换。(这并不总是一件好事。

在这种情况下,它假设你的意思是第一个版本,并试图传入一个数字,并尝试将你给出的字符串隐式转换为数字。由于无法转换,因此会出现ORA-01722错误。

当您修改它以执行时:

to_char(to_date('29.01.2018 00:00:00', 'DD.MM.YYYY HH24:MI:SS'))

您正在将字符串显式转换为日期时间,因此它知道您要使用该版本的函数,而不是数字版本,因为这是实际调用函数时第一个参数的数据类型。

to_char('29.01.2018 00:00:00', 'DD.MM.YYYY HH24:MI:SS')是无用的。'29.01.2018 00:00:00'STRING,不是DATE。将字符串转换为字符串没有任何意义。

为了以特定格式输出带有TO_CHAR()的日期,您必须提供一个DATE(或TIMESTAMP)值。SYSDATE是一个DATE值。

提供DATE的一种方法是使用问题中给出的TO_DATE()函数。

最新更新