2014-11-27 6 views
2

Я хотел бы встроить выражение NVL в AVG. Я пытаюсь вычесть start_date с date_returned, чтобы определить длину кредита в месяцах. Если date_recurned равно null, я хочу использовать сегодняшнюю дату (sysdate). Вот отрывок из моего заявления:Oracle 11G - NVL и AVG

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

Это бросает ошибку ORA-00932, противоречивый тип данных, ожидаемое число получило DATE.

Любые предложения о том, как я могу исправить это утверждение?

+2

Я думаю, вы опустили набор круглых скобок - дата начала, деленная на 30, не имеет смысла, но разница во времени (в днях, предположительно), деленная на 30, имеет смысл. Следовательно: 'AVG ((NVL (date_returned, sysdate) -start_date)/30)'. –

+0

Думаю, вы должны преобразовать свою дату в число и после того, как сможете применить среднюю функцию. См. Http://stackoverflow.com/questions/10307353/averaging-dates-in-oracle-sql –

ответ

0

ошибка, вероятно, происходит от деления:

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 

... но я не мог «Невозможно понять, что для умножения/деления полезно.

Как Джонатан указывает, вероятно, вы забыли скобку ;-)

0

Ваш запрос должен быть таким,

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

Также ваши date_returned должно быть поле даты, если его это ЧИСЛО, то вы 'd получить ошибку ORA-00932, непоследовательный тип данных, ожидаемый NUMBER получил DATE