none
Calcular 'AVOS' sql server 2005 RRS feed

  • Pergunta

  • Bom dia Pessoal,

    Com base nos campos "Data de Admissão" e "Data de Demissão" da tabela de funcionários quero calcular os AVOS que cada funcionário tem direiro.

    Cada AVOS é >= 15 dias de cada mês.

    Por exemplo:

    Na tabela de funcionários, os dados são:

    DataAdmiss    DataDemiss

    2010-01-15       2010-03-10

    2010-01-10       2010-03-31

    2010-01-04       2010-02-14

     

    Resultado:

    1ª linha: 01/2010 = 17 dias   |   02/2010 = 28 dias   |   03/2010 = 10 dias      =   02 AVOS   (ref. 01/2010 e 02/2010)

    2ª linha: 01/2010 = 22 dias   |   02/2010 = 28 dias   |   03/2010 = 31 dias      =   03 AVOS   (ref. 01/2010, 02/2010 e 03/2010)

    3ª linha: 01/2010 = 28 dias   |   02/2010 = 14 dias   |   03/2010 = 00 dias      =   01 AVOS   (ref. 01/2010)

     

    Vcs poderiam me ajudar a fazer este cálculo?

     

    Obrigado,

     

    terça-feira, 27 de abril de 2010 17:45

Respostas

  • segue exemplo:

    USE tempdb
    GO
    
    -- cria a função p/ a calcular avos
    CREATE FUNCTION dbo.fnCalcAvos (@DtAdmiss DATETIME, @DtDemiss DATETIME) 
    RETURNS INT
    BEGIN
      DECLARE @Avos INT
      ; WITH tb (dt) AS
       (
         SELECT @DtAdmiss UNION ALL
         SELECT DATEADD(dd,1,dt) FROM tb WHERE dt < @DtDemiss
       ) 
      
      SELECT @Avos = 
      (
       SELECT DISTINCT COUNT(COUNT(MONTH(dt))) over (PARTITION BY (SELECT 1)) as qtd
       FROM tb
       GROUP BY MONTH(dt)
       HAVING COUNT(MONTH(dt)) > 14
      )
      
      RETURN @Avos
    END
    
    
    
    -- Declaro uma tabela temporária
    DECLARE @T AS TABLE(Id INT IDENTITY(1,1), DtAdmiss DATETIME, DtDemiss DATETIME) 
    
    -- Populo a tabela
    INSERT @T SELECT '2010-01-15', '2010-03-10'
    INSERT @T SELECT '2010-01-10', '2010-03-31'
    INSERT @T SELECT '2010-01-04', '2010-02-14'
    
    -- efetuo o select
    SELECT 
      DtAdmiss, 
      DtDemiss,
      Avos = dbo.fnCalcAvos(DtAdmiss, DtDemiss)
    FROM @t

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    • Marcado como Resposta Marcoss Valle quinta-feira, 29 de abril de 2010 12:17
    quarta-feira, 28 de abril de 2010 13:31

Todas as Respostas

  • Marcos,

    Acho que você poderia utilizar a função DateDiff calculando a diferença entre as datas em dias, após o cálculo você poderá dividir por 15 e resultado será a quantidade de avos.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    terça-feira, 27 de abril de 2010 19:18
  • Bom dia Junior,

    Desta forma o resultado da 1º linha seria 3 AVOS, mas o correto é 2 AVOS.

    select Datediff(day,'2010-01-15','2010-03-10') = 54   |   54/15 = 3 avos

    Não posso acumular os dias de um mês para o outro.

    quarta-feira, 28 de abril de 2010 12:49
  • Marcos vc pode criar uma função p/ calcular.

    irei montar e já posto.


    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    quarta-feira, 28 de abril de 2010 13:19
  • segue exemplo:

    USE tempdb
    GO
    
    -- cria a função p/ a calcular avos
    CREATE FUNCTION dbo.fnCalcAvos (@DtAdmiss DATETIME, @DtDemiss DATETIME) 
    RETURNS INT
    BEGIN
      DECLARE @Avos INT
      ; WITH tb (dt) AS
       (
         SELECT @DtAdmiss UNION ALL
         SELECT DATEADD(dd,1,dt) FROM tb WHERE dt < @DtDemiss
       ) 
      
      SELECT @Avos = 
      (
       SELECT DISTINCT COUNT(COUNT(MONTH(dt))) over (PARTITION BY (SELECT 1)) as qtd
       FROM tb
       GROUP BY MONTH(dt)
       HAVING COUNT(MONTH(dt)) > 14
      )
      
      RETURN @Avos
    END
    
    
    
    -- Declaro uma tabela temporária
    DECLARE @T AS TABLE(Id INT IDENTITY(1,1), DtAdmiss DATETIME, DtDemiss DATETIME) 
    
    -- Populo a tabela
    INSERT @T SELECT '2010-01-15', '2010-03-10'
    INSERT @T SELECT '2010-01-10', '2010-03-31'
    INSERT @T SELECT '2010-01-04', '2010-02-14'
    
    -- efetuo o select
    SELECT 
      DtAdmiss, 
      DtDemiss,
      Avos = dbo.fnCalcAvos(DtAdmiss, DtDemiss)
    FROM @t

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    • Marcado como Resposta Marcoss Valle quinta-feira, 29 de abril de 2010 12:17
    quarta-feira, 28 de abril de 2010 13:31
  • Se entendi bem, acho q o select também ajuda.

     

    SELECT DATAADMISS,DATADEMISS,(MONTH(DATADEMISS2)-MONTH(DATAADMISS2))+1 AS TOTAL_AVOS FROM (
    SELECT DATAADMISS,DATADEMISS,
    (CASE WHEN Datediff(DAY,DATAADMISS,DATEADD(DAY,-DAY(DATAADMISS),DATEADD(MONTH,1,DATAADMISS)))<15 THEN DATEADD(day,(DAY(DATAADMISS)-1),DATAADMISS) ELSE DATAADMISS END) as DATAADMISS2,
    (CASE WHEN DAY(DATADEMISS)<15 THEN DATEADD(day,-DAY(DATADEMISS),DATADEMISS) ELSE DATADEMISS END) as DATADEMISS2
    FROM AVOS
    ) AS SQL1


    "ѕó αqυєℓєѕ q тєм α ¢σяαgєм ∂є ¢αмιηнαя, ρσ∂єм νινєя тσ∂σѕ σѕ ∂ιαѕ ηα ¢єятєzα ∂є ¢нєgαя" msn: poseidonfba@hotmail.com
    quarta-feira, 28 de abril de 2010 13:48
  • Leonardo,

    A função funcionou perfeitamente.

    Obrigado!!

    quinta-feira, 29 de abril de 2010 12:17