Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Calcular la edad con SQL

Estas en el tema de Calcular la edad con SQL en el foro de Oracle en Foros del Web. Buenas, Necesito calcular la edad de los empleados de la empresa y mostrarla en un form. Me he dado cuenta que no sirve poner un ...
  #1 (permalink)  
Antiguo 05/01/2011, 08:19
Avatar de SangrePura  
Fecha de Ingreso: febrero-2006
Mensajes: 28
Antigüedad: 18 años, 9 meses
Puntos: 0
Calcular la edad con SQL

Buenas,

Necesito calcular la edad de los empleados de la empresa y mostrarla en un form. Me he dado cuenta que no sirve poner un valor numérico fijo porque al pasar el tiempo queda desactualizado.

Entonces se me ocurrió restar sysdate y la fecha de nacimiento que se inserte para el empleado, el tema es hacerlo lo más preciso posible.

Les muestro la que hice yo y se acerca bastante pero aún no es precisa, por ejemplo, faltando un día para mi cumpleaños ya me dice que lo he cumplido:

Código:
substr(((sysdate-5)-fecha_nacimiento)/365,1,2) "Edad"
Básicamente, resta la fecha del servidor con la fecha de nacimiento del empleado y lo divide por los 365 días del año. A eso se le pone un substr para que muestre sólo 2 dígitos. Tuve que restarle 5 días a sysdate porque.... la verdad no sé por qué, pero de esa manera el resultado fue más preciso.

Veo que la función es bastante básica y que podría ser mejor, agradecería cualquier ayuda para hacerla más precisa.

Saludos,
  #2 (permalink)  
Antiguo 05/01/2011, 09:46
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Calcular la edad con SQL

Buenos días SangrePura:

Creo que el problema puede estar en que no trunques las horas, por lo tanto el cálculo puede resultar incorrecto. Además, hay un detalle al dividir entre 365 y es que no estás tomando en cuenta los años bisiestos, esto también te puede acarrear problemas en la exactitud del cálculo. Yo en lo particular utilizo la función MONTHS_BETWEEN para el cálculo de fechas de esta manera:

Código SQL:
Ver original
  1. SELECT
  2. trunc(months_between(to_date(to_char(SYSDATE, 'dd/mm/yyyy'), 'dd/mm/yyyy'), to_date(to_char(CAMPO_FECHA, 'dd/mm/yyyy'), 'dd/mm/yyyy'))/12)
  3. FROM TABLA

Si observas tanto al CAMPO_FECHA como al SYSDATE le quito las horas haciendo una doble conversión, primero con TO_CHAR para dejar una cadena con el formato dd/mm/yyyy y luego una conversión a TO_DATE para regresar esta cadena a tipo Fecha, pero ya sin tomar en cuenta las horas y no tener errores de precisión. Es cuestión de hagas la prueba para ver si te funciona.

saludos
Leo.
  #3 (permalink)  
Antiguo 06/01/2011, 12:21
Avatar de ah_puch  
Fecha de Ingreso: agosto-2005
Ubicación: Ecatepec, México
Mensajes: 180
Antigüedad: 19 años, 2 meses
Puntos: 3
Respuesta: Calcular la edad con SQL

hay muchas formas de hacer ese calculo el que yo prefiero es el siguiente

Código SQL:
Ver original
  1. SELECT Abs(EXTRACT(YEAR FROM To_Date('10-10-2010','dd-mm-yyyy')) - EXTRACT(YEAR FROM Sysdate)) AS Edad
  2. FROM Dual

muy fácil y funcional :)

espero te sea de utilidad
__________________
La programacion no es un trabajo, es un Arte
http://www.purodev.blogspot.com
  #4 (permalink)  
Antiguo 06/01/2011, 12:32
Avatar de SangrePura  
Fecha de Ingreso: febrero-2006
Mensajes: 28
Antigüedad: 18 años, 9 meses
Puntos: 0
Respuesta: Calcular la edad con SQL

Qué tal Leonardo,

Bueno comentarte que la consulta funciona perfecto! La he probado y no me cambia la edad hasta las 00hs 00' 00'', lo cual indica que es 100% precisa.

Iwalmente la estoy estudiando un poco porque entre tanta conversión me he perdido un poco

Agradezco tu colaboración y que tengas un excelente 2011!
  #5 (permalink)  
Antiguo 06/01/2011, 12:39
Avatar de SangrePura  
Fecha de Ingreso: febrero-2006
Mensajes: 28
Antigüedad: 18 años, 9 meses
Puntos: 0
Respuesta: Calcular la edad con SQL

Cita:
Iniciado por ah_puch Ver Mensaje
Select Abs(Extract(Year From To_Date('10-10-2010','dd-mm-yyyy')) - Extract(Year From Sysdate)) As Edad
FROM Dual
Hola ah_puch,

He probado esta consulta también y ya me da que he cumplido años (eso no será hasta dentro de 11 días). Reemplazé la tabla dual por la que contiene los datos del empleado y la fecha '10-10-2010' por mi fecha de nacimiento ¿qué puede estar mal?
  #6 (permalink)  
Antiguo 06/01/2011, 12:54
Avatar de ah_puch  
Fecha de Ingreso: agosto-2005
Ubicación: Ecatepec, México
Mensajes: 180
Antigüedad: 19 años, 2 meses
Puntos: 3
Respuesta: Calcular la edad con SQL

Cita:
Iniciado por SangrePura Ver Mensaje
Hola ah_puch,

He probado esta consulta también y ya me da que he cumplido años (eso no será hasta dentro de 11 días). Reemplazé la tabla dual por la que contiene los datos del empleado y la fecha '10-10-2010' por mi fecha de nacimiento ¿qué puede estar mal?
ponme la consulta que construiste para ver que paso :)
__________________
La programacion no es un trabajo, es un Arte
http://www.purodev.blogspot.com
  #7 (permalink)  
Antiguo 06/01/2011, 13:16
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Calcular la edad con SQL

Cita:
Iniciado por ah_puch Ver Mensaje
hay muchas formas de hacer ese calculo el que yo prefiero es el siguiente

Código SQL:
Ver original
  1. SELECT Abs(EXTRACT(YEAR FROM To_Date('10-10-2010','dd-mm-yyyy')) - EXTRACT(YEAR FROM Sysdate)) AS Edad
  2. FROM Dual

muy fácil y funcional :)

espero te sea de utilidad
ah_puch: Efectivamente hay muchas formas de calcular la edad, sin embargo hay un pequeño detalle con tu código. Según la fecha que estás colocando (10 de Octubre de 2010) edad de la persona al día de hoy (en años) sería de 0, sin embargo tu consulta está regresando un 1. Este código funciona solamente para aquellos casos en donde la persona ya cumplió años al momento de la consulta. en mi caso, si pongo mi fecha de nacimiento (21 de Diciembre de 1980) tu código me dice que tengo 31 años, siendo la verdad que sólo tengo 30.

Saludos
Leo.
  #8 (permalink)  
Antiguo 06/01/2011, 13:26
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Calcular la edad con SQL

Cita:
Iniciado por SangrePura Ver Mensaje
Qué tal Leonardo,

Bueno comentarte que la consulta funciona perfecto! La he probado y no me cambia la edad hasta las 00hs 00' 00'', lo cual indica que es 100% precisa.

Iwalmente la estoy estudiando un poco porque entre tanta conversión me he perdido un poco

Agradezco tu colaboración y que tengas un excelente 2011!
Hola de Nuevo SangrePura:

Voy a tratar de explicar un poco las conversiones, para que te queden claro.

En primer lugar está la función TRUNC(argumento) esta función sirve para quitar los decimales que se generan al hacer la división. A la función de se le envía como parámetro la división de los meses comprendidos entre las dos fechas y 12 (los meses del año).

La función MONTHS_BETWEEN(fecha1, fecha2) recibe como parámetro dos fechas o date (fecha actual y fecha de nacimiento). Es justamente en esta función donde es necesario hacer la conversión, se tiene esto

Código:
to_date(to_char(CAMPO_FECHA, 'dd/mm/yyyy'), 'dd/mm/yyyy')
descomponiendo esto, en primer lugar tenemos que

Código:
to_char(CAMPO_FECHA, 'dd/mm/yyyy')
convierte una fecha a caraccter (eliminando las horas y dejándola en el formato dd/mm/yyyy) ahora bien, como la función MONTHS_BETWEEN necesita que se envíe como parámetro una fecha, lo único que hay que hacer es convertir el resultado anterior nuevamente a fecha, con TO_DATE... suena algo complicado, pero si lo analizas un poco creo que es bastante comprensible.

saludos.
Leo.
  #9 (permalink)  
Antiguo 07/01/2011, 06:02
Avatar de SangrePura  
Fecha de Ingreso: febrero-2006
Mensajes: 28
Antigüedad: 18 años, 9 meses
Puntos: 0
Respuesta: Calcular la edad con SQL

Sí sí, la verdad es bastante simple, básicamente se trata de darle a MONTHS_BETWEEN una fecha 'limpia', libre de horas, minutos seg, de manera que pueda hacer un cálculo redondo y, por ende, preciso.

Muchas gracias otra vez!
Saludos,
  #10 (permalink)  
Antiguo 07/01/2011, 06:05
Avatar de SangrePura  
Fecha de Ingreso: febrero-2006
Mensajes: 28
Antigüedad: 18 años, 9 meses
Puntos: 0
Respuesta: Calcular la edad con SQL

Hola ah_puch. Ésta fue la consulta

Código:
SELECT Abs(Extract(Year FROM To_Date('17-01-1986','dd-mm-yyyy')) - Extract(Year FROM Sysdate)) AS Edad

FROM empleados
Como resultado me dice que ya tengo 25, siendo que aún me queda una semana con 24 xD

Saludos,
  #11 (permalink)  
Antiguo 08/01/2011, 11:53
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Calcular la edad con SQL

Mira esto que respondí hace algún tiempo

http://www.forosdelweb.com/f100/como...4/#post3016374

da la edad en años, meses y dias que tiene la persona.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #12 (permalink)  
Antiguo 10/01/2011, 16:24
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Calcular la edad con SQL

Cita:
Iniciado por huesos52 Ver Mensaje
Mira esto que respondí hace algún tiempo

http://www.forosdelweb.com/f100/como...4/#post3016374

da la edad en años, meses y dias que tiene la persona.

saludos
Excelente aportación compañero Huesos52!!! respuesta bastante elegante y por demás completa. Con tanta exactitud me dí cuenta de lo viejo que estoy jejeje

Saludos
Leo.
  #13 (permalink)  
Antiguo 10/01/2011, 19:53
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Calcular la edad con SQL

jajajajaja... a mi también me impresionó que tenía 24 añitos cuando dí la respuesta. Ahora ya son 26
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Etiquetas: edad, sql, calculadora
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:23.