UDF para calcular antiguedad

13/09/2005 - 14:32 por Matías | Informe spam
Hola a todos, tengo que hacer un UDF para calcular la antiguedad de trabajo
de una persona, en una tabla "Personal" tengo FechaIngreso y FechaEgreso,
debo pasarle al UDF estas dos y que me devuelva el resultado de la siguiente
forma: 2 años, 6 meses, 20 días. Tengo las siguiente función para calcular
la edad(creo que es del maestro Rubén Vigón)
CREATE FUNCTION dbo.udfEdad(@FNacim smalldatetime, @AFecha smalldatetime)
RETURNS smallint AS BEGIN
DECLARE @Edad smallint
SET @Edad = Year(@AFecha) - Year(@FNacim)
IF Month(@AFecha) < Month(@FNacim)
SET @Edad = @Edad - 1
ELSE
IF Month(@AFecha) = Month(@FNacim) AND Day(@AFecha) < Day(@FNacim)
SET @Edad = @Edad - 1
RETURN @Edad
END

Mi pregunta es si se podrá adaptar para lo que me hace falta?
Ademas debo tener en cuenta que la columna FechaEgreso puede estar vacia, en
ese caso debo calcular la antiguedad con respecto a la fecha actual.

Saludos y mil gracias..

Preguntas similare

Leer las respuestas

#1 Isaias
13/09/2005 - 17:18 | Informe spam
La funcion debe trabajar perfectamente para lo que necesitas, solo considera
el NULL de la fecha2
Respuesta Responder a este mensaje
#2 Matías
13/09/2005 - 18:50 | Informe spam
Si, funciona bien, pero devuelve "2", en el caso que le pase (01/07/2002,
hoy) me hace falta que devuelva "2 años, 2 meses, 12 Dias) por citar un
ejemplo(el calculo es a ojo y esta mal).
Alguna sugerencias. Gracias.

"Isaias" escribió en el mensaje
news:
La funcion debe trabajar perfectamente para lo que necesitas, solo


considera
el NULL de la fecha2
Respuesta Responder a este mensaje
#3 Alejandro Mesa
13/09/2005 - 23:50 | Informe spam
Trata:

create function dbo.f1 (
@sd datetime,
@ed datetime
)
returns varchar(50)
as
begin
declare @s varchar(50)
declare @y int
declare @m int
declare @d int

set @s = ''
set @y = datediff(year, @sd, @ed) - case when month(@ed) < month(@sd) or
(month(@ed) = month(@sd) and day(@ed) < day(@sd)) then 1 else 0 end
set @m = datediff(month ,dateadd(year, @y, @sd), @ed) - case when day(@ed) <
day(dateadd(year, @y, @sd)) then 1 else 0 end
set @d = datediff(day, dateadd(month, @m, dateadd(year, @y, @sd)), @ed)
set @s = ltrim(@y) + ' año(s), ' + ltrim(@m) + ' mes(es), ' + ltrim(@d) + '
dia(s)'

return @s
end
go

select dbo.f1('20020701', getdate())
go

Result:

3 año(s), 2 mes(es), 12 dia(s)


AMB


"Matías" wrote:

Si, funciona bien, pero devuelve "2", en el caso que le pase (01/07/2002,
hoy) me hace falta que devuelva "2 años, 2 meses, 12 Dias) por citar un
ejemplo(el calculo es a ojo y esta mal).
Alguna sugerencias. Gracias.

"Isaias" escribió en el mensaje
news:
> La funcion debe trabajar perfectamente para lo que necesitas, solo
considera
> el NULL de la fecha2



Respuesta Responder a este mensaje
#4 Matías L
14/09/2005 - 02:40 | Informe spam
Muchas Gracias por tu tiempo, lo voy a probar.
Saludos...

"Alejandro Mesa" escribió en el
mensaje news:
Trata:

create function dbo.f1 (
@sd datetime,
@ed datetime
)
returns varchar(50)
as
begin
declare @s varchar(50)
declare @y int
declare @m int
declare @d int

set @s = ''
set @y = datediff(year, @sd, @ed) - case when month(@ed) < month(@sd) or
(month(@ed) = month(@sd) and day(@ed) < day(@sd)) then 1 else 0 end
set @m = datediff(month ,dateadd(year, @y, @sd), @ed) - case when day(@ed)


<
day(dateadd(year, @y, @sd)) then 1 else 0 end
set @d = datediff(day, dateadd(month, @m, dateadd(year, @y, @sd)), @ed)
set @s = ltrim(@y) + ' año(s), ' + ltrim(@m) + ' mes(es), ' + ltrim(@d) +


'
dia(s)'

return @s
end
go

select dbo.f1('20020701', getdate())
go

Result:

3 año(s), 2 mes(es), 12 dia(s)


AMB


"Matías" wrote:

> Si, funciona bien, pero devuelve "2", en el caso que le pase


(01/07/2002,
> hoy) me hace falta que devuelva "2 años, 2 meses, 12 Dias) por citar un
> ejemplo(el calculo es a ojo y esta mal).
> Alguna sugerencias. Gracias.
>
> "Isaias" escribió en el mensaje
> news:
> > La funcion debe trabajar perfectamente para lo que necesitas, solo
> considera
> > el NULL de la fecha2
>
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida