none
Concomitância entre datas RRS feed

  • Pergunta

  • Bom dia,

    Estou desenvolvendo um módulo onde irá calcular o tempo de contribuição de um empregado (Aposentadoria)

    Por exemplo:

    Empresa 1 = Admissao (01/01/2000) - Demissao (01/12/2000)

    Empresa 2 = Admissao (01/06/2000) - Demissao (01/06/2001)

    Empresa 3 = Admissao (01/01/2001) - Demissao (01/12/2001) 

    Somando o período trabalhado nas empresas daria 3 anos , sendo 1 ano para cada empresa. 

    Porém o tempo de contribuição é igual a 2 anos devido o empregado ter 2 trabalhos (registros) no mesmo período.

    Existe alguma função para esse cálculo?

    Obrigado!



     

    terça-feira, 28 de outubro de 2014 13:39

Respostas

  • Boa tarde,

    Bruno, experimente fazer testes com o script abaixo:

    declare @Tabela table
    (IdEmpregado int, Admissao date, Demissao date);
    
    insert into @Tabela values
    (1, '20000101', '20001201'),
    (1, '20000601', '20010601'),
    (1, '20010101', '20011201'),
    (2, '20100101', '20101231'),
    (2, '20101201', '20110131'),
    (2, '20100201', '20100330');
    
    with 
        CTE_RN as
        (
            select
                *,
                ROW_NUMBER() OVER(PARTITION BY IdEmpregado ORDER BY Admissao, Demissao DESC) as RN
            from @Tabela
        ),
        
        CTE_Rec as
        (
            select
                IdEmpregado,
                DATEDIFF(DAY, Admissao, Demissao) + 1 as QtdDias,
                RN,
                Demissao as DemissaoAnt
            from CTE_RN
            where
                RN = 1
                
            union all
            
            select
                rn.IdEmpregado,
                case when rn.Demissao > rec.DemissaoAnt
                    then 
                        DATEDIFF
                            (DAY, 
                             case when rn.Admissao > rec.DemissaoAnt 
                                 then rn.Admissao
                                 else DATEADD(DAY, 1, rec.DemissaoAnt)
                             end,
                             rn.Demissao) + 1
                    else 0
                end,
                rn.RN,
                case when rn.Demissao > rec.DemissaoAnt then rn.Demissao else rec.DemissaoAnt end
            from CTE_Rec as rec
            inner join CTE_RN as rn
                on 
                    rn.IdEmpregado = rec.IdEmpregado and
                    rn.RN = rec.RN + 1
            
        )
        
    select
        IdEmpregado,
        SUM(QtdDias) as QtdDias
    from CTE_Rec
    group by
        IdEmpregado
    

    Espero que seja útil.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Bruno Nuvolari terça-feira, 28 de outubro de 2014 17:37
    terça-feira, 28 de outubro de 2014 17:13

Todas as Respostas

  • Função nativa do SQL específica para este cálculo certamente não, mas com as sobrecargas da função DATEDIFF é possível. Veja alguns exemplos práticos:

    http://msdn.microsoft.com/pt-br/library/ms189794.aspx

    http://www.devmedia.com.br/funcoes-de-data-no-sql-server/1946

    Marque como resposta se foi útil.

    • Sugerido como Resposta Deric Ferreira terça-feira, 28 de outubro de 2014 13:46
    terça-feira, 28 de outubro de 2014 13:46
  • Deric muito obrigado pela resposta, tentei já com o datediff, mas sem sucesso, o que estou precisando é isso:

    Admissão 01/01/2010 Demissão 31/12/2010 = Tempo 360 dias*

    Admissão 01/12/2010 Demissão 31/01/2011 = Tempo 30 dias
    Admissão 01/02/2010 Demissão 30/03/2010 = Tempo 00 dias

    No segundo e terceiro período não está contando os dias devido estar dentro do intervalo do primeiro período.

    Obrigado

    terça-feira, 28 de outubro de 2014 15:29
  • Nesse caso o problema não é a função, mas a lógica que precisa desenvolver. Você pode pegar a maior data subtrair da menor e obter a diferença em dias. Depois, pode verificar se houveram interrupções na sua série.
    terça-feira, 28 de outubro de 2014 15:56
  • Boa tarde,

    Bruno, experimente fazer testes com o script abaixo:

    declare @Tabela table
    (IdEmpregado int, Admissao date, Demissao date);
    
    insert into @Tabela values
    (1, '20000101', '20001201'),
    (1, '20000601', '20010601'),
    (1, '20010101', '20011201'),
    (2, '20100101', '20101231'),
    (2, '20101201', '20110131'),
    (2, '20100201', '20100330');
    
    with 
        CTE_RN as
        (
            select
                *,
                ROW_NUMBER() OVER(PARTITION BY IdEmpregado ORDER BY Admissao, Demissao DESC) as RN
            from @Tabela
        ),
        
        CTE_Rec as
        (
            select
                IdEmpregado,
                DATEDIFF(DAY, Admissao, Demissao) + 1 as QtdDias,
                RN,
                Demissao as DemissaoAnt
            from CTE_RN
            where
                RN = 1
                
            union all
            
            select
                rn.IdEmpregado,
                case when rn.Demissao > rec.DemissaoAnt
                    then 
                        DATEDIFF
                            (DAY, 
                             case when rn.Admissao > rec.DemissaoAnt 
                                 then rn.Admissao
                                 else DATEADD(DAY, 1, rec.DemissaoAnt)
                             end,
                             rn.Demissao) + 1
                    else 0
                end,
                rn.RN,
                case when rn.Demissao > rec.DemissaoAnt then rn.Demissao else rec.DemissaoAnt end
            from CTE_Rec as rec
            inner join CTE_RN as rn
                on 
                    rn.IdEmpregado = rec.IdEmpregado and
                    rn.RN = rec.RN + 1
            
        )
        
    select
        IdEmpregado,
        SUM(QtdDias) as QtdDias
    from CTE_Rec
    group by
        IdEmpregado
    

    Espero que seja útil.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Bruno Nuvolari terça-feira, 28 de outubro de 2014 17:37
    terça-feira, 28 de outubro de 2014 17:13
  • gapimex era isso mesmo que eu estava precisando, muito obrigado!!!
    terça-feira, 28 de outubro de 2014 17:37