Oracle 日期差异获取年数

Posted

技术标签:

【中文标题】Oracle 日期差异获取年数【英文标题】:Oracle date difference to get number of years 【发布时间】:2011-12-18 02:06:28 【问题描述】:

有没有办法计算日期之间的年数。不知道如何在考虑飞跃和不考虑的情况下做到这一点。是否可以在 SELECT 中执行 IF 语句?

谢谢

【问题讨论】:

【参考方案1】:

我会使用months_between,可能与floor结合使用:

select floor(months_between(date '2012-10-10', date '2011-10-10') /12) from dual;

select floor(months_between(date '2012-10-9' , date '2011-10-10') /12) from dual;

floor 确保您获得四舍五入的年份。如果你想要小数部分,你显然不想使用floor

【讨论】:

很好,我也找到了使用 Union 的另一种方法,但是谢谢。 我使用select trunc(months_between(date_end,date_start)/12) "Age" from dual; 来获取年龄。【参考方案2】:

如果你只想要年份的差异,有:

SELECT EXTRACT(YEAR FROM date1) - EXTRACT(YEAR FROM date2) FROM mytable

或者你也想要小数年?

SELECT (date1 - date2) / 365.242199 FROM mytable

根据 Google 的说法,365.242199 是 1 年的天数。

【讨论】:

区别 EXTRACT(YEAR FROM date1) - EXTRACT(YEAR FROM date2) 是完全错误的获取年数 Ex: date_start = 21-08-2000 , date_end = 01-01-2008 的方法。根据您的逻辑,我们有 8 年,但实际上我们有 7 整年 我认为它取决于“年差”的含义,这并不完全清楚。真的,2008-01-01 - 2000-08-21 大约是 7.4 年。 需要额外的逻辑才能使这个答案准确。如果被减数(被减)的日期和月份晚于被减数,则必须从结果中减去一年。【参考方案3】:

我必须实现一个类似于sybasedatediff 的年份差异函数。在这种情况下,计算的是实际年份差异,而不是四舍五入的天数差异。因此,如果有两个日期相隔一天,则年份差可以为 1(请参阅select datediff(year, '20141231', '20150101'))。

如果必须以这种方式计算年份差异,请使用:

EXTRACT(YEAR FROM date_to) - EXTRACT(YEAR FROM date_from)

仅用于记录(几乎)完整的 datediff 函数:

CREATE OR REPLACE FUNCTION datediff (datepart IN VARCHAR2, date_from IN DATE, date_to IN DATE)
RETURN NUMBER
AS
  diff NUMBER;
BEGIN
  diff :=  CASE datepart
    WHEN 'day'   THEN TRUNC(date_to,'DD') - TRUNC(date_from, 'DD')
    WHEN 'week'  THEN (TRUNC(date_to,'DAY') - TRUNC(date_from, 'DAY')) / 7
    WHEN 'month' THEN MONTHS_BETWEEN(TRUNC(date_to, 'MONTH'), TRUNC(date_from, 'MONTH'))
    WHEN 'year'  THEN EXTRACT(YEAR FROM date_to) - EXTRACT(YEAR FROM date_from)
  END;
  RETURN diff;
END;";

【讨论】:

【参考方案4】:

需要找出年份的差异,如果闰年一年是366天。

我在 oracle 工作不多,请改进一下。 我是这样做的:

SELECT CASE
          WHEN    ( (fromisleapyear = 'Y') AND (frommonth < 3))
               OR ( (toisleapyear = 'Y') AND (tomonth > 2)) THEN
             datedif / 366
          ELSE
             datedif / 365
       END
          yeardifference
  FROM (SELECT datedif,
               frommonth,
               tomonth,
               CASE
                  WHEN (       (MOD (fromyear, 4) = 0)
                           AND (MOD (fromyear, 100) <> 0)
                        OR (MOD (fromyear, 400) = 0)) THEN
                     'Y'
               END
                  fromisleapyear,
               CASE
                  WHEN (   (MOD (toyear, 4) = 0) AND (MOD (toyear, 100) <> 0)
                        OR (MOD (toyear, 400) = 0)) THEN
                     'Y'
               END
                  toisleapyear
          FROM (SELECT (:todate - :fromdate) AS datedif,
                       TO_CHAR (:fromdate, 'YYYY') AS fromyear,
                       TO_CHAR (:fromdate, 'MM') AS frommonth,
                       TO_CHAR (:todate, 'YYYY') AS toyear,
                       TO_CHAR (:todate, 'MM') AS tomonth
                  FROM DUAL))

【讨论】:

【参考方案5】:

对于 Oracle SQL Developer,我能够使用下面的 SQL 行来计算年差。这是为了得到相差 0 到 10 年的年份。您也可以像其他一些响应中所示的那样处理您的 ifs。快乐编码!

TRUNC((MONTHS_BETWEEN(&lt;DATE_ONE&gt;, &lt;DATE_TWO&gt;) * 31) / 365) &gt; 0 and TRUNC((MONTHS_BETWEEN(&lt;DATE_ONE&gt;, &lt;DATE_TWO&gt;) * 31) / 365) &lt; 10

【讨论】:

以上是关于Oracle 日期差异获取年数的主要内容,如果未能解决你的问题,请参考以下文章

从Oracle中的日期差异计算年份

从sql中的表中减去两个日期

如何根据给定的年数生成每周日期

js操作在当前日期加减(天周月年数)

Oracle 日期 - 如何将年份相加

Mongodb,按日期差异分组并获取小时