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
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
.
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.
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;";
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))