计算Oracle中日期差异的年份

时间:2013-09-30 17:42:12

标签: sql oracle

我想计算两个日期之间的年数。

例如: - Select to_date('30-OCT-2013') - TO_date('30-SEP-2014') FROM DUAL;

这将导致335天。我想在几年内证明这一点,这将是.97年。

3 个答案:

答案 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)

为什么呢?因为他们都在回答略有不同的问题。

  • MONTHS_BETWEEN给出两个日期之间的整月数,并将小数部分计算为天数除以31的余数。
  • 除以365.242199假设您希望第一个日期的00:00和第二个日期的00:00之间的太阳年数达到9个有效数字。
  • 第三种方法假设您要计算两个日期之间的日历天数,相对于第一个日期开始的特定年份的日历天数(因此相同的日历天数会给您一个不同的日历天数)年数,取决于在date1和下一年的同一天之间是否有闰日。
  • 摘录(年)方法假设您想知道第一个日期的日历年与第二个日期的日历年之间的整数差异

如果不知道我们在谈论哪一年,那就不可能完美地回答这个问题。我们的意思是太阳年或日历年,如果我们指日历年,我们是否要按月计算(好像所有月份都是相同的长度,它们不是),或者是实际的这些日期和特定年份之间的天数?

事实上,如果我们谈论日历年,那么就不可能以一致的方式计算分数年,因为概念"日历年"并不对应固定的天数。

好消息是(除第四种方法外)所有方法都给出了前两个有效数字的相同答案,正如DCookie所说。因此,当你说" year"时,你可以省去对你的意思的担忧,而是开始考虑其他问题,如性能,可移植性,可读性......这些方法之间的差异也很大。

我确实认为,只要非程序员要求提供类似"两个日期之间的分数年数,"他们应该通过详细解释计算它的不同方法,以及它们为何以及如何不同而受到惩罚,直到他们同意以更好的周数表达(至少有一个固定的好处)天数)。