【问题标题】:Error: ORA-01790: expression must have same datatype as corresponding expression错误:ORA-01790:表达式必须具有与相应表达式相同的数据类型
【发布时间】:2016-06-24 13:50:18
【问题描述】:

运行以下我得到错误Error: ORA-01790: expression must have same datatype as corresponding expression

with x (id, dateN) as
(
select 1, to_date('2015-05-01 00:00:00','YYYY-MM-DD HH24:MI:SS') from dual
union all
select id+1, dateN+1 from x where id < 10
)
select * from x

我尝试了不同的转换,例如 to_char、时间戳、+ 间隔“1”天等等,但这个错误不断出现。在 Mssql 上,通过函数 dateadd('dd', 1, dateN) 很容易,但这里不太明显如何实现。

Oracle 数据库 11g 企业版 11.2.0.1.0 - 64 位生产

【问题讨论】:

  • 我认为它是日期,但我也尝试将它作为时间戳。哦,对不起,我弄错了,是dateN。
  • 您是否要生成一系列日期?
  • 我是,每个下一个生成的日期应该比前一天多一天,第一个在第一个选择中生成。
  • 您展示的内容有效(在 11gR2 中;我认为您必须使用它,否则您会得到 ORA-32033);那么你的where 子句中有什么来限制递归?还是您的真实查询还有更多未显示的内容?
  • “任意”是什么意思?它必须有一些限制,否则它会尝试生成未来的每个日期,直到它在 9999-12-31 之后失败。我的意思是,错误似乎出在您未显示的内容中。这(和 vkp 的限制;以及您编辑的版本)在 11.2.0.4 中工作正常。我不记得有这样的错误,虽然递归 CTE 在 11.2.0.1 中是新的,所以有可能......或者你的客户正在破坏它?你在哪里运行这个?

标签: sql oracle date


【解决方案1】:

由于您使用的是基本版本,因此它看起来像 11840579。您可以通过强制转换值来解决它 - 这不是必需的,但这对您来说是错误:

with x (id, dateN) as
(
  select 1, cast(to_date('2015-05-01 00:00:00','YYYY-MM-DD HH24:MI:SS') as date) from dual
  union all
  select id+1, dateN+1 from x where id < 10
)
select * from x;

在转换中包含额外的元素有点没有意义;无论如何,我个人更喜欢日期文字:

with x (id, dateN) as
(
  select 1, cast(date '2015-05-01' as date) from dual
  union all
  select id+1, dateN+1 from x where id < 10
)
select * from x;

date '2015-01-01'cast(date '2015-05-01' as date) 这两个值是略有不同的类型,具有不同的内部表示,这似乎是导致问题的原因:

select dump(date '2015-05-01', 16) as d1, dump(cast(date '2015-05-01' as date), 16) as d2
from dual;

D1                               D2                             
-------------------------------- --------------------------------
Typ=13 Len=8: df,7,5,1,0,0,0,0   Typ=12 Len=7: 78,73,5,1,1,1,1   

但是,该错误的第二部分是它可能返回错误的结果。如果您无法修补以避免问题,您可以使用较旧的分层查询方法:

select level as id, date '2015-05-01' + level - 1 as dateN
from dual
connect by level < 10;

【讨论】:

  • 现在它可以工作了,但日期按降序排列:2015-05-01 00:00:00.0 2015-04-30 00:00:00.0 2015-04-29 00:00:00.0跨度>
  • 啊是的...您需要阅读 My Oracle Support 上的完整错误描述。除了修补之外,我认为没有解决方法。你可以和你的 DBA 谈谈(如果你有支持合同的话)。
  • @Dmitrii - 添加了获取日期的替代方法,以防您无法修补此错误。
  • 是的,connect by,收到通知时已经在搜索它了,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多