如何从 Oracle 中的日期中获取带小数部分的年份?
How to get year with fractional part from date in Oracle?
我需要一个 PL/SQL 函数,它将日期和 returns 年份作为数字,包括天数的小数部分。例如,1995-01-01
将是 1995.000
,而 2015-11-24
将是 2015.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;
它有效,但感觉要解决一个非常简单的问题需要很多工作。可以用更简洁的方式完成吗?
所以您希望小数部分是当年经过的天数的百分比。这将是一个简单的日期算法,将一年中的第几天除以当年的总天数。
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
最终我最终使用了这个解决方案。它与我在问题中开始的非常相似,但涉及的函数调用更少,而且更简洁。
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;
我需要一个 PL/SQL 函数,它将日期和 returns 年份作为数字,包括天数的小数部分。例如,1995-01-01
将是 1995.000
,而 2015-11-24
将是 2015.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;
它有效,但感觉要解决一个非常简单的问题需要很多工作。可以用更简洁的方式完成吗?
所以您希望小数部分是当年经过的天数的百分比。这将是一个简单的日期算法,将一年中的第几天除以当年的总天数。
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
最终我最终使用了这个解决方案。它与我在问题中开始的非常相似,但涉及的函数调用更少,而且更简洁。
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;