Oracle数据类型错误

时间:2013-01-03 15:34:19

标签: sql oracle etl

我正在尝试通过从列表中列出值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

感谢您对此进行调查。

3 个答案:

答案 0 :(得分:2)

我假设您尝试将日期截断到目标表中。这可以通过这样做来完成:

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

由于您似乎希望以特定格式获取日期字符串 - 其中没有与日期类型相关,以及如何在内部存储thigs - 只需执行此操作:

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

答案 1 :(得分:1)

您说您正在从源表中选择日期列。当它是日期列时,那你为什么要再次转换成日期?当然它也会给出错误..

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

UPDATE1:

alter session set nls_date_format = 'yyyy-mm-dd';


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

答案 2 :(得分:1)

  

“我的源值示例是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选择目标日期时,您只需要应用格式模板。