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的主要内容,如果未能解决你的问题,请参考以下文章