Función De Usuario para Calcular Edad

22/04/2004 - 05:26 por José G. Díaz U. | Informe spam
Saludos.

Estoy haciendo una función que reciba la Cédula de Identidad del Estudiante
y la Fecha Actual para que me devuelva la edad.

La situación es que debido a razones que escapan de mi administración, el
formato de la FechaDeNacimiento está como varchar(10) y no siendo esto lo
peor, el valor de esta cadena puede estar completamente malo con cosas como:

1/50/1918, 01/0/1918, 0/20/1948, etc.

La intención es que cuando la función se encuentre con una fecha de estas,
devuelva un valor como -1.

Este es el código de la función como va:

alter function CalcularEdad (@Cedula bigint, @FechaActual datetime)
returns int
as
begin

declare @Edad int
set @Edad = (select datepart(YYYY,@FechaActual) -

datepart(YYYY,convert(datetime,substring(fecha_nacimiento,5,4) +
substring(fecha_nacimiento,3,2) +
substring(fecha_nacimiento,1,2),101))
EdadEstudiante
from estudiante
where cedula = @Cedula)
return(@Edad)
end
go

Esta función funciona bien cuando el formato de @FechaActual viene correcto,
¿De qué manera podría yo detectar que el formato viene equivocado y devolver
en @Edad = -1 ?

Muchas gracias de antemano.

Joe

P.D.: Esto es la manera como uso la función cuando el formato de la fecha
viene correcto
select primer_apellido,
segundo_apellido,
primer_nombre,
segundo_nombre,
estuneplus.dbo.CalcularEdad(cedula, getdate())
EdadEstudiante
from estudiante
where cedula = '12910333'

Y el resultado devuelto es:

DIAZ UNDA JOSE GREGORIO
29

y eso cuando el formato de la fecha viene equivocado:

select primer_apellido,
segundo_apellido,
primer_nombre,
segundo_nombre,
estuneplus.dbo.CalcularEdad(cedula, getdate())
EdadEstudiante
from estudiante
where cedula = '14021955'

Y el resultado devuelto es:

"Servidor: mensaje 242, nivel 16, estado 3, procedimiento
CalcularEdad, línea 7
La conversión del tipo de datos char a datetime produjo un valor
datetime fuera de intervalo."
 

Leer las respuestas

#1 Carlos Sacristan
22/04/2004 - 08:29 | Informe spam
Puedes probar con la función ISDATE(), que te devuelve 0 si la cadena de
caracteres que le pasas no se puede interpretar como una fecha, aunque con
la cantidad de variaciones que parece que te puedes encontrar no creo que te
garantice que la conversión que estás haciendo sea fiable al 100 por 100,
aunque algo es algo...



Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"José G. Díaz U." escribió en el mensaje
news:
Saludos.

Estoy haciendo una función que reciba la Cédula de Identidad del


Estudiante
y la Fecha Actual para que me devuelva la edad.

La situación es que debido a razones que escapan de mi administración, el
formato de la FechaDeNacimiento está como varchar(10) y no siendo esto lo
peor, el valor de esta cadena puede estar completamente malo con cosas


como:

1/50/1918, 01/0/1918, 0/20/1948, etc.

La intención es que cuando la función se encuentre con una fecha de estas,
devuelva un valor como -1.

Este es el código de la función como va:

alter function CalcularEdad (@Cedula bigint, @FechaActual datetime)
returns int
as
begin

declare @Edad int
set @Edad = (select datepart(YYYY,@FechaActual) -

datepart(YYYY,convert(datetime,substring(fecha_nacimiento,5,4) +
substring(fecha_nacimiento,3,2) +
substring(fecha_nacimiento,1,2),101))
EdadEstudiante
from estudiante
where cedula = @Cedula)
return(@Edad)
end
go

Esta función funciona bien cuando el formato de @FechaActual viene


correcto,
¿De qué manera podría yo detectar que el formato viene equivocado y


devolver
en @Edad = -1 ?

Muchas gracias de antemano.

Joe

P.D.: Esto es la manera como uso la función cuando el formato de la fecha
viene correcto
select primer_apellido,
segundo_apellido,
primer_nombre,
segundo_nombre,
estuneplus.dbo.CalcularEdad(cedula, getdate())
EdadEstudiante
from estudiante
where cedula = '12910333'

Y el resultado devuelto es:

DIAZ UNDA JOSE GREGORIO
29

y eso cuando el formato de la fecha viene equivocado:

select primer_apellido,
segundo_apellido,
primer_nombre,
segundo_nombre,
estuneplus.dbo.CalcularEdad(cedula, getdate())
EdadEstudiante
from estudiante
where cedula = '14021955'

Y el resultado devuelto es:

"Servidor: mensaje 242, nivel 16, estado 3, procedimiento
CalcularEdad, línea 7
La conversión del tipo de datos char a datetime produjo un


valor
datetime fuera de intervalo."



Preguntas similares