如何在Oracle中获得从日期开始的小数部分年份?

时间:2015-11-24 11:10:16

标签: oracle date plsql date-formatting oracle12c

我需要一个PL / SQL函数,它接受一个日期并将年份作为数字返回,包括日期中的小数部分。例如,1995-01-011995.0002015-11-242015.897。这就是我设法制作的:

CREATE OR REPLACE FUNCTION year_fraction (in_date DATE)
RETURN NUMBER
IS
  year NUMBER;
  days NUMBER;
  total_days NUMBER;
BEGIN
  year := EXTRACT(YEAR FROM in_date);
  days := in_date - TRUNC(in_date, 'YEAR');
  total_days := ADD_MONTHS(TRUNC(in_date, 'YEAR'), 12) - TRUNC(in_date, 'YEAR');
  RETURN year + days / total_days;
END year_fraction;

它有效,但感觉很多工作要解决一个简单的问题。这可以用更简洁的方式完成吗?

2 个答案:

答案 0 :(得分:0)

所以你想要小数部分作为当年通过的天数的百分比。这将是一个简单的日期算术,将一年中的日期除以该年的总天数

SQL> SELECT EXTRACT(YEAR FROM SYSDATE)
  2    ||'.'
  3    ||TRUNC(TO_NUMBER(TO_CHAR(SYSDATE, 'DDD'))/
  4    (add_months(TRUNC(SYSDATE,'year'), 12) - TRUNC(SYSDATE,'year'))*1000) my_format
  5  FROM DUAL;

MY_FORMAT
--------------------------------------------------------------------------------
2015.898

答案 1 :(得分:0)

最终我最终使用了这个解决方案。它与我在问题中开始时的内容非常相似,但涉及的函数调用较少,而且更加浓缩。

CREATE OR REPLACE FUNCTION fractional_year (in_date DATE)
RETURN NUMBER
IS
  year DATE;
BEGIN
  year := TRUNC(in_date, 'YEAR');
  -- Year + Days passed so far / Total number of days in year
  RETURN EXTRACT(YEAR FROM year) + (in_date - year) / (ADD_MONTHS(year, 12) - year);
END fractional_year;