我想计算两个日期之间的年数。
例如: - Select to_date('30-OCT-2013') - TO_date('30-SEP-2014') FROM DUAL;
这将导致335天。我想在几年内证明这一点,这将是.97
年。
答案 0 :(得分:4)
只需这样做(除以 365.242199 ):
Select (to_date('30-SEPT-2014') - TO_date('30-OCT-2013'))/365.242199 FROM DUAL;
1年= 365.242199天
OR
使用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而非.97
答案 1 :(得分:1)
我不知道你是怎么想的.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。这样,您可以使用相同的日期来计算一年中的天数。
答案 2 :(得分:0)
其他答案中提出的方法都没有给出完全相同的答案,请看:
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)
为什么呢?因为他们都在回答略有不同的问题。
如果不知道我们在谈论哪一年,那就不可能完美地回答这个问题。我们的意思是太阳年或日历年,如果我们指日历年,我们是否要按月计算(好像所有月份都是相同的长度,它们不是),或者是实际的这些日期和特定年份之间的天数?
事实上,如果我们谈论日历年,那么就不可能以一致的方式计算分数年,因为概念"日历年"并不对应固定的天数。
好消息是(除第四种方法外)所有方法都给出了前两个有效数字的相同答案,正如DCookie所说。因此,当你说" year"时,你可以省去对你的意思的担忧,而是开始考虑其他问题,如性能,可移植性,可读性......这些方法之间的差异也很大。
我确实认为,只要非程序员要求提供类似"两个日期之间的分数年数,"他们应该通过详细解释计算它的不同方法,以及它们为何以及如何不同而受到惩罚,直到他们同意以更好的周数表达(至少有一个固定的好处)天数)。