to_date - Diferencia de fecha de Oracle para obtener el número de años
to_date oracle ejemplos (4)
¿Hay una manera de calcular el número de años entre las fechas. No estoy seguro de cómo hacer esto teniendo en cuenta el salto y qué no. ¿Es posible hacer una declaración IF tal vez en el SELECT?
Gracias
Es necesario encontrar la diferencia en el año, si el año bisiesto es de 366 días.
No trabajo mucho en oracle, por favor haz esto mejor. Así es como lo hice:
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))
Si solo quieres la diferencia en años, hay:
SELECT EXTRACT(YEAR FROM date1) - EXTRACT(YEAR FROM date2) FROM mytable
¿O también quieres años fraccionarios?
SELECT (date1 - date2) / 365.242199 FROM mytable
365.242199 es de 1 año en días, según Google.
Tuve que implementar una función de diferencia de año que funciona de manera similar a la fecha de datediff . En ese caso, se cuenta la diferencia del año real, no la diferencia del día redondeado. Por lo tanto, si hay dos fechas separadas por un día, la diferencia de año puede ser 1 (ver fecha select datediff(year, ''20141231'', ''20150101'')
).
Si el año dif tiene que ser contado de esta manera, entonces use:
EXTRACT(YEAR FROM date_to) - EXTRACT(YEAR FROM date_from)
Solo para el registro la (casi) completa función dateiff:
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;";
Yo usaría months_between
, posiblemente combinado con 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
se asegura de que tengas años redondeados. Si quieres las partes fraccionarias, obviamente no quieres usar floor
.