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

Existe-t-il un moyen de calculer le nombre d'années entre les dates. Je ne sais pas comment faire cela tout en comptabilisant leap et ce qui ne l'est pas. Est-il possible de faire une instruction IF peut-être dans le SELECT?

Merci

25
demandé sur Matt 2011-10-30 07:02:52

4 réponses

Je voudrais utiliser months_between, éventuellement combiné avec 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 fait en sorte que vous obtenez des années arrondies vers le bas. Si vous voulez les parties fractionnaires, vous voulez évidemment ne pas utiliser floor.

34
répondu René Nyffenegger 2011-10-30 05:16:45

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 des années fractionnaires aussi?

SELECT (date1 - date2) / 365.242199 FROM mytable

365.242199 est 1 an en jours, selon Google.

12
répondu eaolson 2011-10-30 04:11:56

J'ai dû implémenter une fonction de diff d'année qui fonctionne de manière similaire à sybase datediff . Dans ce cas, la différence réelle de l'année est comptée, et non la différence de jour arrondie. Donc, s'il y a deux dates séparées par un jour, la différence d'année peut être de 1 (voir select datediff(year, '20141231', '20150101')).

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

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

Juste pour le journal la fonction datediff (presque) complète:

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
répondu TrueY 2016-10-17 17:02:10

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

Je ne travaille pas beaucoup dans oracle, veuillez améliorer cela. Voici comment je l'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
répondu user3036120 2013-11-26 11:14:52