代码之家  ›  专栏  ›  技术社区  ›  mikcutu

为记录字段[重复]填充表时,无法转换为VARCHAR

  •  0
  • mikcutu  · 技术社区  · 6 年前

    我正在使用Oracle Database 12c Enterprise Edition 12.1.0.2.0版-64位产品,从两条select语句开始:

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

    vs。

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

    我在问为什么1st select返回错误: ORA-01722: invalid number ?

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

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

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

    非常感谢您,

    2 回复  |  直到 6 年前
        1
  •  2
  •   Alex Poole    6 年前

    我在问为什么1st select返回错误:ORA-01722:无效数字?

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

    如果只传递字符串,而不传递第二个format model参数:

    to_char('29.01.2018 00:00:00')
    

    然后它会使用 char 版本,不投诉。但是您提供了第二个参数,因此只有number和datetime版本 可以 有效。

    它们都不接受文本文字作为第一个参数。但Oracle通常会尽力提供帮助,并允许进行大量隐式转换。(这并不总是一件好事。)

    在本例中,它假定您指的是第一个版本,并且正在尝试传入一个数字,并尝试将您提供的字符串隐式转换为一个数字。由于无法转换,因此会出现ORA-01722错误。

    当您将其修改为执行以下操作时:

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

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

        2
  •  1
  •   Wernfried Domscheit    6 年前

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

    为了以特定格式输出日期 TO_CHAR() 您必须提供 日期: (或 TIMESTAMP )值。 SYSDATE 是一个 日期: 价值

    提供 日期: 正在使用 TO_DATE() 功能如您的问题所示。

    推荐文章