Это было бы
TRUNC (AVG (appt.contact_date - REF.entry_date) OVER (PARTITION BY ser2.prov_name), 1)
, потому что:
- если CONTACT_DATE и ENTRY_DATE относятся к типу данных DATE (и да, так и должно быть), вам не нужно (на самом деле, не нужно) «преобразовывать» дату снова.
- Если они являются строками (то есть хранятся в столбцах VARCHAR2), тогда да - вы должны преобразовать их в DATE, применяя TO_DATE с соответствующей маской формата
- Разница между двумя значениями DATE - это количество дней, поэтому нет проблем в AVG, что
- усечение тоже в порядке
РЕДАКТИРОВАТЬ
Еще немного информации: вот пример, который показывает, что происходит:
SQL> with
2 appt (contact_date) as
3 (select trunc(sysdate) from dual union
4 select null from dual union all
5 select null from dual),
6 ref (entry_date) as
7 (select trunc(sysdate - 5) from dual),
8 ser2 (prov_name) as
9 (select 'a' from dual)
10 select appt.contact_date, ref.entry_date, ser2.prov_name,
11 TRUNC (AVG (appt.contact_date - REF.entry_date) OVER (PARTITION BY ser2.prov_name), 1) avg_by_provider
12 from appt, ref, ser2;
CONTACT_ ENTRY_DA P AVG_BY_PROVIDER
-------- -------- - ---------------
30.04.18 25.04.18 a 5
25.04.18 a 5
25.04.18 a 5
SQL>
Хотя существует два значения NULL, AVG по-прежнему возвращает результат , который не равен NULL. Как так? Из-за стандарта ANSI SQL, который говорит, что агрегатные функции (такие как AVG) игнорируют значения NULL.