CREATE FUNCTION YEARFRAC(
start_date IN DATE,
end_date IN DATE
) RETURN NUMBER DETERMINISTIC
IS
$IF DBMS_DB_VERSION.ver_le_11 $THEN
$ELSE
PRAGMA UDF;
$END
y1 PLS_INTEGER := EXTRACT(YEAR FROM start_date);
m1 PLS_INTEGER := EXTRACT(MONTH FROM start_date);
d1 PLS_INTEGER := EXTRACT(DAY FROM start_date);
y2 PLS_INTEGER := EXTRACT(YEAR FROM end_date);
m2 PLS_INTEGER := EXTRACT(MONTH FROM end_date);
d2 PLS_INTEGER := EXTRACT(DAY FROM end_date);
BEGIN
IF m1 = 2 AND TRUNC(start_date) = LAST_DAY(TRUNC(start_date)) THEN
IF m2 = 2 AND TRUNC(end_date) = LAST_DAY(TRUNC(end_date)) THEN
d2 := 30;
END IF;
d1 := 30;
END IF;
IF d2 = 31 AND d1 >= 30 THEN
d2 := 30;
END IF;
IF d1 = 31 THEN
d1 := 30;
END IF;
RETURN (360*(y2-y1)+30*(m2-m1)+d2-d1)/360;
END yearfrac;
/
然后道:
WITH date_range ( start_date, end_date ) AS (
SELECT DATE '2021-01-07', DATE '2021-07-07' FROM DUAL UNION ALL
SELECT DATE '2021-01-01', DATE '2021-02-01' FROM DUAL UNION ALL
SELECT DATE '2021-01-01', DATE '2021-12-30' FROM DUAL UNION ALL
SELECT DATE '2021-01-01', DATE '2021-12-31' FROM DUAL
)
SELECT start_date,
end_date,
yearfrac( start_date, end_date )
FROM date_range
1条答案
按热度按时间lb3vh1jj1#
YEARFRAC
是一个Excel函数(以及其他支持的电子表格)。如您的错误所述:
YEARFRAC
函数未在Oracle中定义,因此您无法使用它。如果你想要一些等价的东西,那么你将需要编写一个自定义函数。
如果您想要
YEARFRAC
的默认US(NADS)30/360行为,则:然后道:
输出:
| 开始日期|结束日期|年分数_天数30_360|
| - -|- -|- -|
| 2021年1月7日|2021年7月7日|0.5分|
| 2021年1月1日|2021年2月1日|0.083333333333333333元人民币|
| 2021年1月1日|二十一年十二月三十日|0.9972222222222222元人民币|
| 2021年1月1日|二十一年十二月三十一日|一个|