Sql Oracle数据类型错误

Sql Oracle数据类型错误,sql,oracle,etl,Sql,Oracle,Etl,我试图通过从列也是datedatatype的源表中选择一个值,将一个值插入datedatatype。我直接选择了列,没有使用to_date函数进行任何转换,因为这两种类型相同,但我得到以下错误: SQL Error: ORA-00932: inconsistent datatypes: expected DATE got NUMBER 00932. 00000 - "inconsistent datatypes: expected %s got %s" 我检查了两次,源列没有空值 inser

我试图通过从列也是
date
datatype的源表中选择一个值,将一个值插入
date
datatype。我直接选择了列,没有使用
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

谢谢你调查这件事

我假设您试图将日期截断到目标表中的当天。这可以通过以下方式实现:

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\u DATE
是日期,而不是字符串

EDIT2

由于您似乎希望以特定的格式获取日期字符串—这与日期类型以及内部存储方式无关—只需执行以下操作:

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

我假设您试图将日期截断到目标表中的当天。这可以通过以下方式实现:

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\u DATE
是日期,而不是字符串

EDIT2

由于您似乎希望以特定的格式获取日期字符串—这与日期类型以及内部存储方式无关—只需执行以下操作:

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

您说过要从源表中选择日期列。当它是日期列时,为什么要再次转换为日期?当然,它也会产生错误

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

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

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
“我的源值示例为2013年6月11日,我需要目标值作为 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(),则取决于格式掩码

如果两个列都是日期数据类型,那么就太复杂了:不需要在INSERT中强制转换值

insert into Target (Targetdate) 
select Source.START_DATE
from Source
target
选择目标日期时,只需应用格式掩码

“我的源值示例为2013年6月11日,我需要目标值作为 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(),则取决于格式掩码

如果两个列都是日期数据类型,那么就太复杂了:不需要在INSERT中强制转换值

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

target

选择目标日期时,您只需应用一个格式掩码,因为dd是日期输入的默认值,您可以省略trunc的第二个参数。@Dazzal谢谢,尽管我总是保留它-因为我倾向于忘记函数的默认行为:)trunc没有解决我的问题。更具体地说,我的源表的示例值是11-JUN-13,我需要目标值YYYY-MM-DD如何实现这一点?因此,您需要一个文本表示(例如字符串),该文本表示为
2011-06-13
?在这种情况下,您应该使用@APC post的答案,并且仅在选择zour值时格式化它们。。。另外,我建议您从编码中退一步,熟悉数据库系统的基本工作原理,以及如何使用数据类型……由于dd是日期输入的默认值,您可以省略trunc的第二个参数。@Dazzal谢谢,尽管我总是把它留在里面——因为我倾向于忘记函数的默认行为:)trunc并没有解决我的问题。更具体地说,我的源表的示例值是11-JUN-13,我需要目标值YYYY-MM-DD如何实现这一点?因此,您需要一个文本表示(例如字符串),该文本表示为
2011-06-13
?在这种情况下,您应该使用@APC post的答案,并且仅在选择zour值时格式化它们。。。另外,我建议您从编码中退一步,熟悉数据库系统的基本工作原理,以及如何使用数据类型……实际上,当我直接插入值时,我得到了这个错误。这就是为什么我要进行转换,因为两个表都有相同的日期格式?你能告诉我源表中日期的格式吗?好的,让我更具体一点。。。我的源值示例为2013年6月11日,我需要目标值为YYYY-MM-DD如何实现此目标?@user1751356“好的,让我更具体一些……我的源值示例为2013年6月11日,我需要目标值为YYYY-MM-DD如何实现此目标”如果两列都是
date
格式,则在存储日期时不必担心格式。在内部,日期存储为数字。如果选择时需要特定格式,则使用
到字符(您的字符日期'YYYY-MM-DD')
或在会话级别使用
更改会话集nls\u日期\u格式='YYYY-MM-DD'但这只是为了显示结果,而不是存储结果!非常感谢。这对我来说很有意义。但是,为什么我在尝试向目标插入值时会出现这个错误。实际上,当我直接插入值时,我会出现这个错误。这就是为什么我要进行转换,因为两个表都有相同的日期格式?你能告诉我源表中日期的格式吗?好的,让我更具体一点。。。我的源值示例为2013年6月11日,我需要目标值为YYYY-MM-DD。我如何实现此目标?@user1751356“好,让m