我正在使用 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 种与第一选择相关的情况:
- 当它从记录填充VARCHAR2字段时,它工作得很好。
- 当它从记录表中填充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()
函数。