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

Función para el cálculo de la edad

Estas en el tema de Función para el cálculo de la edad en el foro de SQL Server en Foros del Web. Estimados (que dijeron ando preguntando no?... jaja) no, aquí les dejo una función para calcular la edad con los días transcurridos, igual y si ya ...
  #1 (permalink)  
Antiguo 27/01/2009, 09:21
Avatar de erick_arcini  
Fecha de Ingreso: julio-2005
Ubicación: Jaltenco / DF
Mensajes: 1.723
Antigüedad: 18 años, 9 meses
Puntos: 50
Función para el cálculo de la edad

Estimados (que dijeron ando preguntando no?... jaja) no, aquí les dejo una función para calcular la edad con los días transcurridos, igual y si ya se encontraba una pues ya ni modo, aquí la dejo.


Código:
create function edad(@nacimiento as datetime)
returns varchar(25)
as 
begin
declare @aYear varchar(3)
declare @diasTranscurridos varchar(3)

set @aYear = year(getdate()) - year(@nacimiento)

if month(getdate()) < month(@nacimiento)
	begin
		set @aYear = @aYear - 1 
		set @diasTranscurridos = datediff(day,convert(varchar,year(getdate())) + '/01/01',getdate())+1
		set @diasTranscurridos = 365 - @diasTranscurridos
	end
else
	begin
		if month(getdate()) > month(@nacimiento)
			begin
				set @diasTranscurridos = datediff(day,convert(varchar,year(getdate())) + '/01/01',getdate())+1
			end
		else
			begin
				if month(getdate()) = month(@nacimiento)
					begin
						if day(getdate()) = day(@nacimiento)
							begin
								set @aDia = 0
							end
						else
							begin
								if day(getdate()) < day(@nacimiento)
									begin
										set @aYear = @aYear - 1 
										set @diasTranscurridos = datediff(day,convert(varchar,year(getdate()) - 1) + '/01/01',convert(varchar,year(getdate()) - 1) + '/31/12') - (datediff(day,convert(varchar,year(getdate())) + '/' + convert(varchar,month(getdate())) + '/01',getdate()) + 1)
									end
								else
									begin 
										if day(getdate()) > day(@nacimiento)
											begin 
												set @diasTranscurridos = datediff(day,convert(varchar,year(getdate())) + '/' + convert(varchar,month(getdate())) + '/01',getdate())+1
											end
									end
							end
					end
			end
	end
return @aYear + ' años ' + @diasTranscurridos + ' días'
end
__________________
Mejoremos nuestro país, ayudemos al planeta... próximamente.
  #2 (permalink)  
Antiguo 27/01/2009, 10:36
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Función para el cálculo de la edad

Gracias, por aqui hemos publicado algo sobre el tema, donde se calculan, años, meses, dias, horas y hasta minutos, si no mal recuerdo.

Saludos
  #3 (permalink)  
Antiguo 27/01/2009, 10:43
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Respuesta: Función para el cálculo de la edad

Gracias por el aporte pero,

1. Al ejecutar indica uso indebido de getdate en funcion de usuario.
2. Al cambiar a stored procedure, indica que faltan declarar varibales.
3. Al declarar las variables faltantes y tratar de ejecutar con 30 de Enero de 1990, indica este msg de error.

Server: Msg 242, Level 16, State 3, Procedure edad, Line 34
The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.


Y bueno ya no continue depurando...

Saludos!



Cita:
Iniciado por erick_arcini Ver Mensaje
Estimados (que dijeron ando preguntando no?... jaja) no, aquí les dejo una función para calcular la edad con los días transcurridos, igual y si ya se encontraba una pues ya ni modo, aquí la dejo.


Código:
create function edad(@nacimiento as datetime)
returns varchar(25)
as 
begin
declare @aYear varchar(3)
declare @diasTranscurridos varchar(3)

set @aYear = year(getdate()) - year(@nacimiento)

if month(getdate()) < month(@nacimiento)
	begin
		set @aYear = @aYear - 1 
		set @diasTranscurridos = datediff(day,convert(varchar,year(getdate())) + '/01/01',getdate())+1
		set @diasTranscurridos = 365 - @diasTranscurridos
	end
else
	begin
		if month(getdate()) > month(@nacimiento)
			begin
				set @diasTranscurridos = datediff(day,convert(varchar,year(getdate())) + '/01/01',getdate())+1
			end
		else
			begin
				if month(getdate()) = month(@nacimiento)
					begin
						if day(getdate()) = day(@nacimiento)
							begin
								set @aDia = 0
							end
						else
							begin
								if day(getdate()) < day(@nacimiento)
									begin
										set @aYear = @aYear - 1 
										set @diasTranscurridos = datediff(day,convert(varchar,year(getdate()) - 1) + '/01/01',convert(varchar,year(getdate()) - 1) + '/31/12') - (datediff(day,convert(varchar,year(getdate())) + '/' + convert(varchar,month(getdate())) + '/01',getdate()) + 1)
									end
								else
									begin 
										if day(getdate()) > day(@nacimiento)
											begin 
												set @diasTranscurridos = datediff(day,convert(varchar,year(getdate())) + '/' + convert(varchar,month(getdate())) + '/01',getdate())+1
											end
									end
							end
					end
			end
	end
return @aYear + ' años ' + @diasTranscurridos + ' días'
end
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #4 (permalink)  
Antiguo 27/01/2009, 16:29
Avatar de erick_arcini  
Fecha de Ingreso: julio-2005
Ubicación: Jaltenco / DF
Mensajes: 1.723
Antigüedad: 18 años, 9 meses
Puntos: 50
Respuesta: Función para el cálculo de la edad

Cita:
Iniciado por Andres95 Ver Mensaje
...
1. Al ejecutar indica uso indebido de getdate en funcion de usuario.

Que raro, yo lo ejecuto sin broncas, solo que me equivoque en una linea del código donde dice @aDia pero funciona

Cita:
Iniciado por Andres95 Ver Mensaje

2. Al cambiar a stored procedure, indica que faltan declarar varibales.
mmmm, deja pasarlo y contesto esta pregunta

Cita:
Iniciado por Andres95 Ver Mensaje

3. Al declarar las variables faltantes y tratar de ejecutar con 30 de Enero de 1990, indica este msg de error.

Server: Msg 242, Level 16, State 3, Procedure edad, Line 34
The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.
supongo que esto debe de ser con el store procedure, mmmm, deja probarlo y pues ya veremos como queda, gracias por el tip.
Y bueno ya no continue depurando...
__________________
Mejoremos nuestro país, ayudemos al planeta... próximamente.
  #5 (permalink)  
Antiguo 27/01/2009, 16:39
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Respuesta: Función para el cálculo de la edad

Ok, tienes razon, si compila pero en SQL 2005 y yo la estaba probando en SQL 2000.

Si embargo el msg de error es el mismo cuando lo pruebo con el 30 de Enero de 1990.


Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #6 (permalink)  
Antiguo 28/01/2009, 17:01
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Función para el cálculo de la edad

Hola,

Odio decir esto pero la lógica está mal (después de corregir solamente el problema de la declaración de la variable @aDia). El resultado que obtengo en MSSQL 2000 :

para la fecha 20 de Noviembre de 1972 ('19721101')
al día de hoy 28 de Enero de 2009: 36 años 337 días.
Cuando en realidad debería ser : 36 Años 69 Dias

para la fecha 27 de Enero de 2009 ('20090127')
al día de hoy : 0 años 28 días
En realidad debería ser : 0 Años 1 Dias

Con 30 de Enero de 1992 genera un error.
Creo que podría ser mas simple, es un script :
(Para sp ó function hay que parametrizarlo, etc.)

Código:
declare @fecha datetime
declare @final datetime
declare @annos integer
declare @dias  integer
declare @temp  datetime

-- set @fecha = '20090128'
-- set @final = '20090128'

set @fecha = '19721120'
set @final = getdate()

set @annos = datediff(Year, @fecha, @final)
set @temp = dateadd(Year, @annos, @fecha)
set @dias = datediff(Day, @temp, @final)
if sign(@dias) < 0
begin
  set @annos = @annos - 1
  set @temp = dateadd(Year, @annos, @fecha)
  set @dias = datediff(Day, @temp, @final)
end

print CONVERT(NVARCHAR, @annos) + N' Años ' + CONVERT(NVARCHAR, @dias) + N' Dias'
Saludos,
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 10:25.