3

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

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

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

4

3 回答 3

4

只需这样做(除以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

于 2013-09-30T17:45:21.143 回答
1

我不知道你怎么计算那是 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。这样,您可以使用相同的日期来计算一年中的天数。

于 2013-09-30T18:07:43.287 回答
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 和下一年的同一日期之间是否有闰日)。
  • extract(year) 方法假设您想知道第一个日期的日历年和第二个日期的日历年之间的整数差

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

事实上,如果我们谈论日历年,根本不可能以一致的方式计算小数年数,因为“日历年”的概念并不对应于固定的天数。

好消息是(除了第四种方法)所有方法都对前 2 个有效数字给出了相同的答案,正如 DCookie 所说。因此,当您说“年份”时,您可以不用担心您的意思,而是开始考虑其他问题,例如性能、可移植性、可读性……这些方法之间也有很大不同。

不过,我确实认为,每当一个非程序员要求“两个日期之间的小数年数”之类的东西时,他们应该受到惩罚,详细解释不同的计算方法,以及为什么和如何计算。不同,直到他们同意最好用周数表示(这至少有包含固定天数的好处)。

于 2017-11-24T10:12:47.537 回答