respuesta de Bryan Denny es más correcto que la respuesta aceptada (no estaba segura de cómo para poner esto en otro lugar que no sea una nueva respuesta, esta es mi primera vez en StackOverflow). primer intento
Marcos':
select DATEDIFF(customer.dob, '2010-01-01')/365.25 as age
será en primer lugar producir un resultado negativo (los argumentos a DATEDIFF están en el orden equivocado), y en segundo lugar producirán resultados inexactos para algunas fechas, por ejemplo:
SELECT DATEDIFF('2010-05-11','1984-05-11')/365.25 AS age
produce el resultado:
25.9986
no se puede simplemente siempre redondear, porque eso también causará resultados inexactos para otras entradas. segundo intento
Marcos:
SELECT DATE_FORMAT(FROM_DAYS(DATEDIFF(customer.dob,'2010-01-01')), ‘%Y’)+0 AS age
Una vez más, los argumentos están en el orden equivocado, excepto que esta vez en lugar de sólo la producción de un número negativo, los FROM_DAYS() función no funciona correctamente con entrada negativa. En segundo lugar, si miramos más de cerca a la salida de los FROM_DAYS() Función:
select from_days(datediff('2010-09-16','1984-05-11'));
El resultado de lo anterior es:
0026-05-08
que está literalmente "8 de mayo, Año 26 (después de 0) ". Tenga en cuenta que para los tipos de fecha y hora, no hay un mes "0", por lo que si desea utilizar este formato para medir un intervalo de fechas con los meses incluidos, debe restar 1 del mes. Del mismo modo, con el componente día, no hay un "0", por lo que el resultado no es lo que se espera para este problema cuando la fecha pasa a ser el cumpleaños:
select from_days(datediff('2010-05-11','1984-05-11'));
produce:
0025-12-31
que si acortamos usando el formato de fecha de Marcos nos da "25", que es un cálculo incorrecto de la edad.
La respuesta de Bryan Denny es correcta en todos estos casos extremos. Su fórmula es bastante ingeniosa:
SELECT DATE_FORMAT(reference, '%Y') - DATE_FORMAT(birthdate, '%Y') - (DATE_FORMAT(reference, '00-%m-%d') < DATE_FORMAT(birthdate, '00-%m-%d')) AS age
La primera parte calcula la diferencia en años entre las dos fechas. Entonces, si tomamos "2010" y "1984" como referencia y fecha de nacimiento, respectivamente, el resultado es "26". La segunda parte luego calcula esencialmente "¿El día y el día de la fecha de nacimiento ocurren después del mes y día de referencia?" Si lo hace, "todavía no ha sucedido", por lo que debemos restar un 1 adicional de la diferencia del año para compensarlo. Esto se soluciona con el resultado de la comparación <, que devuelve 1 si es verdadero y 0 si es falso.
ejemplos Así, completos:
1)
Reference date: 2010-05-10;
Birthdate: 1984-05-11
Year difference = 2010 - 1984 = 26
Month and day comparison: May 10th < May 11th? Yes => subtract an additional year
Calculated age: 25 years
2)
Reference date: 2010-05-11;
Birthdate: 1984-05-11
Year difference = 2010 - 1984 = 26
Month and day comparison: May 11th < May 11th? No => subtract 0
Calculated age: 26 years
espero que esto hace las cosas más claras para las personas!
¡eso es excelente! ¡muchas gracias! –
Me alegro de que te haya ayudado. Marque la respuesta como aceptada, para que otras personas puedan usarla en el futuro :-) –
Tengo curiosidad: ¿para qué sirve el 0.25? – ryanprayogo