如何在Oracle中使用YEARFRAC

km0tfn4u  于 2022-11-03  发布在  Oracle
关注(0)|答案(1)|浏览(129)

我想在Oracle数据库中实现一个Excel表的逻辑。
我在Oracle的存储过程中使用YEARFRAC(),但收到如下错误:
错误(166,22):PLS-00201:必须声明标识符'YEARFRAC'
下面是我的代码:

v_STD_REVISED_AMT := YEARFRAC('01-04-2016', V_FINALSRDATE, 'dd-mm-yy');

我如何实现这一点,或者是否有其他方法在Oracle中实现YEARFRAC

更新

第二个参数值是07-05-2018

lb3vh1jj

lb3vh1jj1#

YEARFRAC是一个Excel函数(以及其他支持的电子表格)。
如您的错误所述:

Error(166,22): PLS-00201: identifier 'YEARFRAC' must be declared

YEARFRAC函数未在Oracle中定义,因此您无法使用它。
如果你想要一些等价的东西,那么你将需要编写一个自定义函数。

  • (注:Excel function不使用默认的第3个参数计算日期和年份之间的实际天数,而是使用US(NASD)30/360计算天数的方法;如果您只是单纯地计算天数,则输出结果将与Excel不匹配。)*

如果您想要YEARFRAC的默认US(NADS)30/360行为,则:

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

输出:
| 开始日期|结束日期|年分数_天数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日|二十一年十二月三十一日|一个|

  • db〈〉小提琴

相关问题