miércoles, 2 de marzo de 2011

SQL Función para obtener antiguedad o Seniority

Por medio de esta función pueden obtener la antiguedad , por ejemplo en un trabajo:

Select dbo.ToolSeniority('20090701','20110111')

RESULTADO:

-------------------------
1 Año 6 Meses 10 Días

Usa dos funciones: (que fui encontrando y adaptando a las necesidades puntuales  del formato de salida)


CREATE FUNCTION dbo.DateDiffPoda
(
@type char(2),
        @FromDate DATETIME,
        @ToDate DATETIME
)
RETURNS INT
BEGIN
        RETURN  
   CASE
               WHEN @FromDate > @ToDate THEN NULL --Filtra fecha invertida
ELSE

  Case
  When upper(@type) not in ('YY','MM','DD') THEN NULL  
  WHEN upper(@type)='YY' THEN       --AÑO
CASE 
  WHEN DATEPART(day, @FromDate) > DATEPART(day, @ToDate) THEN DATEDIFF(month, @FromDate, @ToDate) - 1
  ELSE DATEDIFF(month, @FromDate, @ToDate)
END / 12
  WHEN upper(@type)='MM' THEN       --MES
CASE
  WHEN DATEPART(day, @FromDate) > DATEPART(day, @ToDate) THEN DATEDIFF(month, @FromDate, @ToDate) - 1
  ELSE DATEDIFF(month, @FromDate, @ToDate)
END
  WHEN upper(@type)='DD' THEN       --MES
CASE
  WHEN convert(nvarchar,@FromDate,108) > convert(nvarchar,@ToDate,108)  THEN DATEDIFF(dd, @FromDate, @ToDate) - 1
  ELSE DATEDIFF(dd, @FromDate, @ToDate)
END
end

END
END
GO

CREATE function ToolSeniority
(
        @FechaIngreso DATETIME,
        @FechaActual DATETIME
)
RETURNS varchar(25)
--------------------
--Ezequiel Podadera
--22/02/2010
--------------------

Begin
Declare @FechaAñoActual datetime  --Fecha que tiene el mismo año que fecha actual (para calculo interno)
Declare @FechaAñoActualMES datetime --Fecha que tiene el mismo año y mes que fecha actual (para calcular diff días)

Declare @DiffAño int
Declare @DiffMes int 
Declare @DiffDia int 

--set @FechaIngreso=getdate()-1549  DATOS DE PRUEBA
--set @FechaActual=getdate()

SET @DiffAño = dbo.datediffPoda('yy',@FechaIngreso,@FechaActual) 

-- FechaAñoActual se posiciona a fecha sin diff en años, para calcular diff en mes
SET @FechaAñoActual = Dateadd(yy, @DiffAño,@FechaIngreso) 
SET @DiffMes = dbo.datediffPoda('mm',@FechaAñoActual,@FechaActual)

-- FechaAñoActualMes se posiciona a fecha sin diff en años-meses, para calcular diff en días
SET @FechaAñoActualMES = DateADD(mm,@DiffMes,@FechaAñoActual)  
SET @DiffDia = dbo.datediffPoda('dd', @FechaAñoActualMES,@FechaActual)

--Formatea la salida
Declare @sAño varchar(8)
Declare @sMes varchar(9)
Declare @sDia varchar(8)
Declare @sSalida varchar(25)

set @sAño=        case when @DiffAño = 0   then ''
  when @DiffAño = 1   then Cast(@DiffAño as varchar) + ' Año '
  when @DiffAño > 1   then Cast(@DiffAño as varchar) + ' Años '
end

set @sMes=        case when @DiffMes = 0   then ''
  when @DiffMes = 1   then Cast(@DiffMes as varchar) + ' Mes '
  when @DiffMes > 1   then Cast(@DiffMes as varchar) + ' Meses '
end

set @sDia=      case when @DiffDia = 0   then ''
  when @DiffDia = 1   then Cast(@DiffDia as varchar) + ' Día '
  when @DiffDia > 1   then Cast(@DiffDia as varchar) + ' Días '
end
set @sSalida= Case when @sAño + @sMes + @sDia ='' then 'Sin Antiguedad' else @sAño + @sMes + @sDia end

Return @sSalida
END

GO

No hay comentarios:

Publicar un comentario