В Oracle мы можем сделать простую арифметику по датам. В качестве альтернативы, мы можем превратить разницу в тип ИНТЕРВАЛ:
SQL> select id
2 , start_date
3 , end_date
4 , (end_date - start_date) as arith_diff
5 , (end_date - start_date) DAY TO SECOND as ds_interval
6 from t42
7 /
ID START_DATE END_DATE ARITH_DIFF DS_INTERVAL
------ -------------------- -------------------- ---------- --------------------
111 11-FEB-2010 05:44:52 01-MAR-2010 08:10:18 18.1009954 +18 02:25:26.000000
222 15-APR-2010 10:50:46 19-MAY-2010 01:44:08 33.6203935 +33 14:53:22.000000
333 01-JUN-2010 00:00:00 31-AUG-2010 00:00:00 91 +91 00:00:00.000000
444 11-FEB-2010 00:00:00 01-MAR-2010 00:00:00 18 +18 00:00:00.000000
SQL>
редактировать
"в функции days360 возвращает 20. в
ваш код это 18.10. что я хочу это
функция, которая должна работать точно
как days360 "
Хорошо, функция Excel days360()
вычисляет разницу между двумя датами на основе года из двенадцати тридцати дней. Нет встроенного Oracle, который делает это. Фил Сингер написал свою собственную реализацию PL / SQL: найдите его здесь . Также обязательно прочитайте его последующую часть . Конечно, функция Фила дает желаемые результаты:
SQL> select id
2 , start_date
3 , end_date
4 , days360(start_date, end_date) as days360
5 from t42
6 /
ID START_DATE END_DATE DAYS360
---------- -------------------- -------------------- ----------
111 11-FEB-2010 05:44:52 01-MAR-2010 08:10:18 20
222 15-APR-2010 10:50:46 19-MAY-2010 01:44:08 34
333 01-JUN-2010 00:00:00 31-AUG-2010 00:00:00 90
444 11-FEB-2010 00:00:00 01-MAR-2010 00:00:00 20
SQL>