una to_date sumar obtener mes insertar horas formato fechas fecha ejemplos comparar add_months oracle select

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 .