为记录字段填充 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:
- 当它从记录填充 VARCHAR2 字段时,它工作得很好。
- 当它从 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'))
你明确地将字符串转换为日期时间,所以它知道你想使用函数的那个版本,而不是数字版本,因为这是实际调用函数时第一个参数的数据类型..
我正在使用 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:
- 当它从记录填充 VARCHAR2 字段时,它工作得很好。
- 当它从 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'))
你明确地将字符串转换为日期时间,所以它知道你想使用函数的那个版本,而不是数字版本,因为这是实际调用函数时第一个参数的数据类型..