我想计算两个日期之间的年数。
例如:-Select to_date('30-OCT-2013') - TO_date('30-SEP-2014') FROM DUAL;
这将导致 335 天。我想在几年内展示这一点,这将是.97
几年。
只需这样做(除以365.242199):
Select (to_date('30-SEPT-2014') - TO_date('30-OCT-2013'))/365.242199 FROM DUAL;
1 年 = 365.242199 天
或者
使用MONTHS_BETWEEN尝试这样的事情:-
select floor(months_between(date '2014-10-10', date '2013-10-10') /12) from dual;
或者你也可以试试这个:-
SELECT EXTRACT(YEAR FROM date1) - EXTRACT(YEAR FROM date2) FROM DUAL;
335/365.242199 = 0.917199603 而不是 0.97
我不知道你怎么计算那是 0.97 年。这是我得到的:
SQL> SELECT ( TO_date('30-SEP-2014') - to_date('30-OCT-2013')) /
(ADD_MONTHS(DATE '2013-10-30',12) - DATE '2013-10-30') "Year Fraction"
FROM DUAL;
Year Fraction
-------------
0.91780821917
您将不得不选择一个日期来计算您的年份。这是一种方法。我选择将一年设为 2013 年 10 月 30 日和 2014 年 10 月 30 日之间的天数。您也可以在 2013 年 9 月 30 日到 2014 年 9 月 30 日之间度过一年。
顺便说一句,如果您只对小数点后 2 位感兴趣,那么 365 几乎与 366 一样好。
更新:在计算分母时使用了 ADD_MONTHS。这样,您可以使用相同的日期来计算一年中的天数。
其他答案中提出的方法都没有给出完全相同的答案,请看:
with dates as ( select to_date('2013-10-01', 'YYYY-MM-DD') as date1, to_date('2014-09-01', 'YYYY-MM-DD') as date2 from dual)
select months_between(date2, date1)/12 as years_between, 'months_between(date1, date2)' as method from dates
union
select (date2 - date1)/365.242199, '(date2 - date1) / 365.242199' from dates
union
select extract(year from date2) - extract(year from date1), 'extract(year) from date2 - extract(year from date1)' from dates
union
select (date2 - date1) / (ADD_MONTHS(date1 ,12) - date1), '(nb days between date1 and date2) / (nb days in 1 year starting at date1)' from dates
;
给
YEARS_BETWEEN METHOD
0.9166666666666666666666666666666666666667 months_between(date1, date2)
0.9171996032145234127231831719422979380321 (date2 - date1) / 365.242199
0.9178082191780821917808219178082191780822 nb days date2-date1 / (nb days in 1 year starting at date1)
1 extract(year) from date2 - extract(year from date1)
为什么?因为他们都在回答略有不同的问题。
在不知道我们谈论的是哪一年的情况下,不可能完美地回答这个问题。我们是指一个太阳年,还是一个日历年,如果我们指的是一个日历年,我们是要按月计算(好像所有月份的长度都相同,但实际上它们不是)还是按实际数量来计算?这些日期和特定年份之间的天数?
事实上,如果我们谈论日历年,根本不可能以一致的方式计算小数年数,因为“日历年”的概念并不对应于固定的天数。
好消息是(除了第四种方法)所有方法都对前 2 个有效数字给出了相同的答案,正如 DCookie 所说。因此,当您说“年份”时,您可以不用担心您的意思,而是开始考虑其他问题,例如性能、可移植性、可读性……这些方法之间也有很大不同。
不过,我确实认为,每当一个非程序员要求“两个日期之间的小数年数”之类的东西时,他们应该受到惩罚,详细解释不同的计算方法,以及为什么和如何计算。不同,直到他们同意最好用周数表示(这至少有包含固定天数的好处)。