Usuário com melhor resposta
Calcular 'AVOS' sql server 2005

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,
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
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] -
-
-
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
-
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 -
-
Leia o artigo Como Calcular em Número de Dias a Diferença Entre Duas Datas com o C# (CSharp)
http://cavas.com.br/index.php/programacao/como-calcular-em-numero-de-dias-a-diferenca-entre-duas-datas-com-o-c-csharp
Abraços,
Marcelo Pereira Cavalini