为记录字段填充 table 时无法转换为 VARCHAR

conversion into VARCHAR not possible when populating a table for records field

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

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;

我问为什么第一个 select return 错误:ORA-01722: invalid number?

为什么第一个select,为了return预期的结果需要写成:select to_char(to_date('29.01.2018 00:00:00', 'DD.MM.YYYY HH24:MI:SS')) from dual;?

...从这里推断我还有另外两种情况与第一种 select:

  1. 当它从记录填充 VARCHAR2 字段时,它工作得很好。
  2. 当它从 table 条记录填充 VARCHAR2 字段时,它会 return 上面的错误消息?

非常感谢,

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() 函数。

I am asking why 1st select returns error: ORA-01722: invalid number?

to_char() 有三个版本,它们采用不同的数据类型参数; one for number, one for datetime and one for char.

如果你只传递了你的字符串,没有第二个 format-model 参数:

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'))

你明确地将字符串转换为日期时间,所以它知道你想使用函数的那个​​版本,而不是数字版本,因为这是实际调用函数时第一个参数的数据类型..