web-dev-qa-db-fra.com

Différence de date Oracle pour obtenir le nombre d'années

Est-il possible de calculer le nombre d'années entre les dates. Vous ne savez pas comment faire cela tout en tenant compte du bond et de ce qui ne l'est pas. Est-il possible de faire une instruction IF peut-être dans le SELECT?

Merci

26
Matt

J'utiliserais months_between, éventuellement associé à 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 veille à ce que vos années soient arrondies. Si vous voulez les parties décimales, vous voulez évidemment ne pas utiliser floor.

39
René Nyffenegger

Si vous voulez juste la différence en années, il y a:

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

Ou voulez-vous aussi des fractions d'années?

SELECT (date1 - date2) / 365.242199 FROM mytable

365.242199 est 1 an en jours, selon Google.

14
eaolson

J'ai dû implémenter une fonction year diff qui fonctionne de la même manière que sybasedatiff . Dans ce cas, la différence en année réelle est comptée et non la différence en jours arrondis. Ainsi, s'il y a deux dates séparées par un jour, la différence d'année peut être égale à 1 (voir select datediff(year, '20141231', '20150101')). 

Si le diff année doit être compté de cette façon, utilisez:

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

Juste pour enregistrer la fonction (presque) complète de la commande datiff:

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;";
2
TrueY

Besoin de trouver la différence d'année si l'année bissextile est de 366 jours.

Je ne travaille pas beaucoup dans Oracle, je vous prie de l'améliorer. Voici comment j'ai fait:

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))
0
user3036120