years hours dif delete dates calculation mysql sql

mysql - hours - ¿Cómo obtener la diferencia en años a partir de dos fechas diferentes?



mysql date calculation (7)

Aquí está la expresión que también atiende años bisiestos:

YEAR(date1) - YEAR(date2) - (DATE_FORMAT(date1, ''%m%d'') < DATE_FORMAT(date2, ''%m%d''))

Esto funciona porque la expresión (DATE_FORMAT(date1, ''%m%d'') < DATE_FORMAT(date2, ''%m%d'')) es true si date1 es "anterior en el año" que date2 y porque en mysql, true = 1 y false = 0 , entonces el ajuste es simplemente una cuestión de restar la "verdad" de la comparación.

Esto le da los valores correctos para sus casos de prueba, excepto para la prueba n. ° 3: creo que debe ser "3" para ser consistente con la prueba n. ° 1:

create table so7749639 (date1 date, date2 date); insert into so7749639 values (''2011-07-20'', ''2011-07-18''), (''2011-07-20'', ''2010-07-20''), (''2011-06-15'', ''2008-04-11''), (''2011-06-11'', ''2001-10-11''), (''2007-07-20'', ''2004-07-20''); select date1, date2, YEAR(date1) - YEAR(date2) - (DATE_FORMAT(date1, ''%m%d'') < DATE_FORMAT(date2, ''%m%d'')) as diff_years from so7749639;

Salida:

+------------+------------+------------+ | date1 | date2 | diff_years | +------------+------------+------------+ | 2011-07-20 | 2011-07-18 | 0 | | 2011-07-20 | 2010-07-20 | 1 | | 2011-06-15 | 2008-04-11 | 3 | | 2011-06-11 | 2001-10-11 | 9 | | 2007-07-20 | 2004-07-20 | 3 | +------------+------------+------------+

Ver SQLFiddle

Quiero obtener la diferencia en años a partir de dos fechas diferentes utilizando la base de datos MySQL.

por ejemplo:

  • 2011-07-20 - 2011-07-18 => 0 años
  • 2011-07-20 - 2010-07-20 => 1 año
  • 2011-06-15 - 2008-04-11 => 2 3 años
  • 2011-06-11 - 2001-10-11 => 9 años

¿Qué tal la sintaxis SQL? ¿Hay alguna función incorporada de MySQL para producir el resultado?


Esto funciona bien, incluso teniendo en cuenta los años bisiestos:

select floor((cast(date_format(''2016-02-14'',''%Y%m%d'') as int) - cast(date_format(''1966-02-15'',''%Y%m%d'') as int)/10000);

Mantener la palabra como un decimal será incorrecta la mayor parte del tiempo.


Me gusta la solución de Bohemian, pero ¿qué pasa con el uso de timestampdiff

select date1, date2,timestampdiff(YEAR,date2,date1) from so7749639

sqlfiddle

simplemente parece más fácil.


Número de años entre date1 y date2:

IF((YEAR(date2) - YEAR(date1)) > 0, (YEAR(date2) - YEAR(date1)) - (MID(date2, 6, 5) < MID(date1, 6, 5)), IF((YEAR(date2) - YEAR(date1)) < 0, (YEAR(date2) - YEAR(date1)) + (MID(date1, 6, 5) < MID(date2, 6, 5)), (YEAR(date2) - YEAR(date1))))

Ahora para algunos comentarios sobre esto.

  1. Estos resultados devuelven un número entero de años, meses y días. Ellos tienen "piso". Por lo tanto, 1,4 días se mostrarían como 1 día, y 13,9 años se mostrarían como 13 años. Del mismo modo, -1.4 años se mostrarían como -1 año, y -13.9 meses se mostrarían como -13 meses.

  2. Tenga en cuenta que utilizo expresiones booleanas en muchos casos. Como las expresiones booleanas se evalúan a 0 o 1, puedo usarlas para restar o agregar 1 del total en función de una condición.


Simplemente por: SELECT TIMESTAMPDIFF(YEAR, date1, date2) AS difference FROM table .


podrías simplemente usar

SELECT ROUND((TO_DAYS(date2) - TODAYS(date1)) / 365) ...

También envuélvalo con ABS() si desea siempre un número positivo, sin importar qué fecha preceda a la otra.

Con ROUND() , 0.6 años se considerarán 1 año; si, en cambio, desea contar solo los años completos, puede usar FLOOR() . En este caso, 0.6 años se considerarán 0 años y 1.9 años se considerarán 1 año.


mysql> SELECT FLOOR(DATEDIFF(''2011-06-11'',''2001-10-11'')/365); +------------------------------------------------+ | FLOOR(DATEDIFF(''2011-06-11'',''2001-10-11'')/365) | +------------------------------------------------+ | 9 | +------------------------------------------------+ 1 row in set (0.00 sec)

DATEDIFF() devuelve la diferencia en días entre dos fechas. Esto no tiene específicamente en cuenta los años bisiestos, pero puede funcionar en tales casos:

mysql> SELECT FLOOR(DATEDIFF(''2007-07-11'',''2004-07-11'')/365); +------------------------------------------------+ | FLOOR(DATEDIFF(''2007-07-11'',''2004-07-11'')/365) | +------------------------------------------------+ | 3 | +------------------------------------------------+ 1 row in set (0.00 sec)