Разница в дате Oracle для получения количества лет - PullRequest
26 голосов
/ 30 октября 2011

Есть ли способ рассчитать количество лет между датами. Не уверен, как это сделать при учете скачка, а что нет. Возможно ли сделать оператор IF, возможно, в SELECT?

Спасибо

Ответы [ 4 ]

42 голосов
/ 30 октября 2011

Я бы использовал 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.

15 голосов
/ 30 октября 2011

Если вы просто хотите разницу в годах, есть:

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

Или вы хотите также дробные годы?

SELECT (date1 - date2) / 365.242199 FROM mytable

365.242199 - это 1 год в днях, согласноGoogle.

2 голосов
/ 12 октября 2015

Мне пришлось реализовать функцию разницы в год, которая работает аналогично datediff . В этом случае учитывается разница в реальном году, а не округленная разница в днях. Таким образом, если две даты разделены одним днем, разница в году может быть 1 (см. select datediff(year, '20141231', '20150101')).

Если необходимо рассчитать разницу в год, используйте:

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

Только для журнала (почти) полная функция датированного числа:

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;";
0 голосов
/ 26 ноября 2013

Нужно найти разницу в году, если високосный год равен 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...