Buscar apenas últimos dias dos meses SQL

10/10/2017

1

Bom dia, estou montando uma consulta no SQL que traz o acumulado diário de um fluxo de caixa.
Porém o que interessa pra mim é apenas o valor acumulado do último dia de cada mês.
Ex: eu preciso que me traga apenas os valores dos dias 31/01, 28/02, 31/03, 30/04, 31/05 e assim por diante.

Desde já agradeço a compreensão
Responder

Posts

10/10/2017

Venancio

Olá Gustavo, por favor poste uma tabela como exemplo para facilitar a resolução.
Responder

10/10/2017

Luiz Santos

Boa tarde Gustavo.
Não entendi muito bem o que você precisa, mas se estiver usando a versão 2012 ou superior do SQL Server, você tem a função EOMONTH:

SELECT EOMONTH(GETDATE())


Já versões anteriores, temos esse método, um pouco comprido, mas que também funciona:

SELECT DATEADD(DAY, -1, CONVERT(VARCHAR(8), YEAR(DATEADD(MONTH, 1, GETDATE())) * 10000 + MONTH(DATEADD(MONTH, 1, GETDATE())) * 100 + 1, 112))


Espero ter conseguido te ajudar.

Grande abraço
Responder

10/10/2017

Luiz Santos

Gustavo.

Segue uma forma um pouco menos bisonha que a minha.

SELECT DATEADD(DAY,-(DAY(DATEADD(MONTH,1,GETDATE()))), DATEADD(MONTH,1,GETDATE())) 
Responder

10/10/2017

Gustavo

Boa tarde a todos, obrigado pelas dicas. Segue exemplo do que eu fiz para conseguir o que eu queria, mas não sei se é o jeito correto, eu fiz vários Unions, onde cada um busca as ultimas datas de movimentação em cada conta bancária dentro de um mês. Se eu quisesse buscar por exemplo, a última data de movimentação dos últimos 24 meses, eu teria que fazer 24 Unions. Deu certo, mas eu achei estranho a solução, gostaria de saber se tecnicamente tem uma solução melhor. Segue sql conforme solicitado:

SELECT Empresa_dtc, Conta_dtc, MAX (UltDataSaldo_dtc) AS UltimoSaldodoMes
FROM(
SELECT
Empresa_sdcc AS Empresa_dtc, Banco_sdcc AS Banco_dtc, Conta_sdcc AS Conta_dtc, MAX(Data_sdcc) as UltDataSaldo_dtc
FROM SaldoConta
LEFT JOIN Bancos ON
Banco_sdcc = Numero_banco
LEFT JOIN Ccorrente ON
Empresa_sdcc = Empresa_banco
AND Banco_sdcc = Ccorrente.Numero_banco
AND Conta_sdcc = Conta_banco
WHERE DATEDIFF(Month, Data_sdcc, GETDATE()) = 1 AND
Empresa_sdcc IN('44')AND AtInat_banco = 0
GROUP BY Empresa_sdcc, Banco_sdcc, Conta_sdcc, Tipo_banco
) AS ULTIMOSALDO
GROUP BY Conta_dtc, Empresa_dtc


UNION

SELECT Empresa_dtc, Conta_dtc, MAX (UltDataSaldo_dtc) AS UltimoSaldodoMes
FROM(
SELECT
Empresa_sdcc AS Empresa_dtc, Banco_sdcc AS Banco_dtc, Conta_sdcc AS Conta_dtc, MAX(Data_sdcc) as UltDataSaldo_dtc
FROM SaldoConta
LEFT JOIN Bancos ON
Banco_sdcc = Numero_banco
LEFT JOIN Ccorrente ON
Empresa_sdcc = Empresa_banco
AND Banco_sdcc = Ccorrente.Numero_banco
AND Conta_sdcc = Conta_banco
WHERE DATEDIFF(Month, Data_sdcc, GETDATE()) = 2 AND
Empresa_sdcc IN('44')AND AtInat_banco = 0
GROUP BY Empresa_sdcc, Banco_sdcc, Conta_sdcc, Tipo_banco
) AS ULTIMOSALDO
GROUP BY Conta_dtc, Empresa_dtc

UNION

SELECT Empresa_dtc, Conta_dtc, MAX (UltDataSaldo_dtc) AS UltimoSaldodoMes

FROM(

SELECT
Empresa_sdcc AS Empresa_dtc, Banco_sdcc AS Banco_dtc, Conta_sdcc AS Conta_dtc, MAX(Data_sdcc) as UltDataSaldo_dtc
FROM SaldoConta
LEFT JOIN Bancos ON
Banco_sdcc = Numero_banco
LEFT JOIN Ccorrente ON
Empresa_sdcc = Empresa_banco
AND Banco_sdcc = Ccorrente.Numero_banco
AND Conta_sdcc = Conta_banco
WHERE DATEDIFF(Month, Data_sdcc, GETDATE()) = 3 AND
Empresa_sdcc IN('44')AND AtInat_banco = 0
GROUP BY Empresa_sdcc, Banco_sdcc, Conta_sdcc, Tipo_banco
) AS ULTIMOSALDO
GROUP BY Conta_dtc, Empresa_dtc

Dados retornados:

Empresa_dtc Conta_dtc UltimoSaldodoMes
44 0006095-0 2017-07-31 00:00:00.000
44 0006095-0 2017-08-18 00:00:00.000
44 0006095-0 2017-09-20 00:00:00.000
44 0013065741-3 2017-07-31 00:00:00.000
44 0013065741-3 2017-08-04 00:00:00.000
44 0013065741-3 2017-09-11 00:00:00.000
44 013065741-3 2017-07-18 00:00:00.000
44 13060544-7 2017-07-31 00:00:00.000
44 13060544-7 2017-08-31 00:00:00.000
44 13060544-7 2017-09-29 00:00:00.000
44 13065741-3 2017-07-31 00:00:00.000
44 13065741-3 2017-08-31 00:00:00.000
44 13065741-3 2017-09-29 00:00:00.000
44 6095-0 2017-07-31 00:00:00.000
44 6095-0 2017-08-31 00:00:00.000
44 6095-0 2017-09-29 00:00:00.000
44 6919-1 2017-09-29 00:00:00.000
Responder