Oracle 11G - NVL 和 AVG

Posted

技术标签:

【中文标题】Oracle 11G - NVL 和 AVG【英文标题】:Oracle 11G - NVL and AVG 【发布时间】:2014-11-27 15:18:31 【问题描述】:

我想在 AVG 中嵌入 NVL 表达式。我试图从 date_returned 中减去 start_date 以确定贷款的月数。如果 date_returned 为空,我想使用今天的日期 (sysdate)。这是我声明中的一个 sn-p:

avg(nvl(date_returned,sysdate)-start_date/30) "Loan Length in Months" 

这会引发 ORA-00932 错误,数据类型不一致,预期 NUMBER 得到 DATE。

关于如何更正此声明的任何建议?

【问题讨论】:

我认为您省略了一组括号——开始日期除以 30 没有意义,但时间差(可能是天数)除以 30 确实有意义。因此:AVG((NVL(date_returned,sysdate)-start_date)/30). 我认为您必须将日期转换为数字,然后才能应用平均函数。见***.com/questions/10307353/… 【参考方案1】:

你的查询应该是这样的,

avg(nvl(date_returned,sysdate)-start_date)/30 "Loan Length in Months" 

你的 date_returned 也应该是一个日期字段,如果它是 NUMBER,那么你会得到 ORA-00932 错误,数据类型不一致,预期 NUMBER 得到 DATE

【讨论】:

【参考方案2】:

错误可能来自分区:

SQL> select sysdate/30 from dual;
select sysdate/30 from dual
       *
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected NUMBER got DATE

Oracle 允许添加/减去日期,因为它假定数字表示天数:

SQL> select sysdate-1, sysdate+1 from dual;

SYSDATE-1 SYSDATE+1
--------- ---------
26-NOV-14 28-NOV-14

...但我无法弄清楚乘法/除法的可能含义。

正如 Jonathan 指出的,您可能忘记了括号 ;-)

【讨论】:

以上是关于Oracle 11G - NVL 和 AVG的主要内容,如果未能解决你的问题,请参考以下文章

oracle 11g 表空间使用率

oracle 11g 分区表

Oracle函数中对变量赋值不起作用,用的是oracle11g

oracle的nvl和nvl2是啥函数,两者区别是啥呢

oracle的nvl和nvl2是啥函数,两者区别是啥呢

Oracle的nvl函数和nvl2函数