【问题标题】:Oracle datatype errorOracle 数据类型错误
【发布时间】:2013-01-03 15:34:18
【问题描述】:

我试图通过从列也是date 数据类型的源表中选择一个值来将一个值插入date 数据类型。我直接选择了列,没有使用 to_date 函数进行任何转换,因为两者是相同的类型,但我收到以下错误:

SQL Error: ORA-00932: inconsistent datatypes: expected DATE got NUMBER
00932. 00000 -  "inconsistent datatypes: expected %s got %s"

我已经检查了两倍,源列没有空值。

insert into Target(Targetdate) 
  select to_date(Source.START_DATE,'yyyy-mm-dd')
    from Source

感谢您对此进行调查。

【问题讨论】:

    标签: sql oracle etl


    【解决方案1】:

    我假设您尝试将截断为当天的日期放入 Target 表中。可以这样做:

    insert into Target(Targetdate) select trunc(Source.START_DATE,'DD') from Source
    

    编辑

    Dazzal 提到,由于这是将第二个参数留给 TRUNC 时的默认操作,所以这甚至更简单一点:

    insert into Target(Targetdate) select trunc(Source.START_DATE) from Source
    

    您查询的问题是Source.START_DATE 是日期,而不是字符串...

    EDIT2

    您似乎想要以特定格式获取日期字符串 - 这与日期类型没有任何关系,以及内部存储的方式 - 只需执行以下操作:

    SELECT to_char(START_DATE,'YYYY-MM-DD' from Source;
    

    【讨论】:

    • 因为 dd 是日期输入的默认值,您可以省略 trunc 的第二个参数。
    • @Dazzal 谢谢,虽然我总是把它留在里面 - 因为我倾向于忘记函数的默认行为:)
    • trunc 没有解决我的问题。更具体地说,我的源表的示例值是 11-JUN-13,我需要目标值作为 YYYY-MM-DD 我怎样才能做到这一点?
    • 所以你想要一个读作2011-06-13的文本表示(例如字符串)?在这种情况下,您应该使用发布的答案@APC,并且仅在选择 zour 值时对其进行格式化...此外,我建议您从编码中退一步,并熟悉数据库系统的工作方式基本上,以及如何使用数据类型...
    【解决方案2】:

    您说您正在从源表中选择一个日期列。当它是日期列时,为什么要再次转换为日期?当然也会报错..

    insert into Target(Targetdate) 
    select to_date(Source.START_DATE,'yyyy-mm-dd'), from Source
    

    'to_date'函数的输入参数是'string'

    to_date( string1, [ format_mask ], [ nls_language ] )
    

    更新1:

    alter session set nls_date_format = 'yyyy-mm-dd';
    
    
    insert into Target(Targetdate) 
    select to_char(Source.START_DATE,'yyyy-mm-dd') from Source
    

    【讨论】:

    • 实际上,当我直接插入值时,我得到了这个错误。这就是我进行此转换的原因
    • 那么两个表的日期格式相同吗?你能告诉我源表中日期的格式吗?
    • 好的,让我说得更具体一些...我的源值示例是 11-JUN-13,我需要目标值作为 YYYY-MM-DD 我该如何实现?
    • @user1751356 “好吧,让我更具体一点……我的源值示例是 11-JUN-13,我需要目标值作为 YYYY-MM-DD 我怎样才能实现这一点”如果两者都列是date 格式,那么您在存储日期时不必担心格式。在内部,日期存储为数字。如果您在选择时需要特定格式,请使用TO_CHAR(your_date, 'YYYY-MM-DD') 或在会话级别使用alter session set nls_date_format='yyyy-mm-dd';,但这只是为了显示结果,而不是存储它!
    • 谢谢。这对我来说很有意义。但是,为什么我在尝试向目标插入值时会出现此错误。
    【解决方案3】:

    “我的源值示例是 11-JUN-13,我需要目标值作为 YYYY-MM-DD 我怎样才能做到这一点? "

    所有 Oracle 日期都以相同的内部格式存储:

    SQL>  select dump(sysdate) from dual;
    
    DUMP(SYSDATE)
    ---------------------------------------------
    Typ=13 Len=8: 221,7,1,3,10,22,8,0
    
    SQL>     
    

    显示日期完全取决于客户端环境的默认值,或者我们使用 TO_CHAR() 时的格式掩码。

    如果您的两列都是 DATE 数据类型,则您的事情过于复杂:您不需要在 INSERT 中转换值。

    insert into Target (Targetdate) 
    select Source.START_DATE
    from Source
    

    Target中选择目标日期时,只需应用格式掩码即可。

    【讨论】:

      猜你喜欢
      • 2012-04-23
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 2015-03-19
      相关资源
      最近更新 更多