Usuário com melhor resposta
Concomitância entre datas

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!
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
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
- Sugerido como Resposta Deric Ferreira 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 diasNo segundo e terceiro período não está contando os dias devido estar dentro do intervalo do primeiro período.
Obrigado
-
-
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
-