Como Exibir o Último Dia do Mês Atual no Formato DD/MM/YYYY (SQL Server)
Uma necessidade comum em relatórios e rotinas de fechamento é descobrir qual é o último dia do mês atual, seja para calcular vencimentos, seja para delimitar o período de uma consulta. Neste post você vai ver a forma mais simples de fazer isso nas versões atuais do SQL Server, além da forma alternativa para quem ainda precisa dar suporte a versões mais antigas.
Forma recomendada (SQL Server 2012 em diante): EOMONTH
Desde o SQL Server 2012, existe a função EOMONTH, criada justamente para isso: ela recebe uma data e retorna o último dia do mês correspondente, sem precisar de nenhum cálculo manual.
SELECT CONVERT(VARCHAR(10), EOMONTH(GETDATE()), 103) AS UltimoDiaDoMes;
Se quiser o último dia de um mês diferente do atual, basta passar outra data como parâmetro:
SELECT CONVERT(VARCHAR(10), EOMONTH('2026-03-15'), 103) AS UltimoDiaDoMes;
O EOMONTH também aceita um segundo parâmetro opcional para somar ou subtrair meses antes de calcular o último dia. Por exemplo, para obter o último dia do mês seguinte:
SELECT CONVERT(VARCHAR(10), EOMONTH(GETDATE(), 1), 103) AS UltimoDiaDoProximoMes;
Forma alternativa (versões anteriores ao SQL Server 2012)
Se você ainda precisa dar suporte a uma versão do SQL Server anterior a 2012, quando EOMONTH não existia, o mesmo resultado pode ser obtido combinando DATEADD e DAY:
DECLARE @UltimoDiaMes DATETIME;
SELECT @UltimoDiaMes = DATEADD(DAY, -DAY(GETDATE()), DATEADD(MONTH, 1, GETDATE()));
PRINT CONVERT(VARCHAR(10), @UltimoDiaMes, 103);
A lógica por trás desse cálculo:
-
DATEADD(MONTH, 1, GETDATE())avança a data atual em um mês. -
DAY(GETDATE())pega o dia atual do mês (por exemplo, 17). -
DATEADD(DAY, -DAY(GETDATE()), ...)volta essa mesma quantidade de dias a partir da data já avançada em um mês, o que sempre resulta no último dia do mês original, independentemente de quantos dias esse mês tem.
Entendendo o CONVERT e o estilo 103
Em ambos os exemplos, a formatação da data para o padrão dd/mm/yyyy é feita com CONVERT:
CONVERT(VARCHAR(10), data, 103)
A sintaxe do CONVERT funciona assim:
-
Primeiro argumento: o tipo de dado para o qual o valor será convertido (
VARCHAR(10), nesse caso). - Segundo argumento: o valor a ser convertido (a data).
- Terceiro argumento: o estilo de formatação a ser aplicado.
O estilo 103 formata a data no padrão britânico/francês, dd/mm/yyyy, com o ano completo em 4 dígitos. É por isso que ele é normalmente usado para exibir datas no padrão utilizado no Brasil.
Existem vários outros estilos disponíveis no CONVERT, cada um com um formato de data e hora diferente. A documentação oficial da Microsoft mantém a lista completa e atualizada de estilos suportados.
Uma alternativa mais flexível: FORMAT
Desde o SQL Server 2012 (a mesma versão que introduziu o EOMONTH), também é possível usar a função FORMAT para formatar datas com mais liberdade, usando máscaras de formato:
SELECT FORMAT(EOMONTH(GETDATE()), 'dd/MM/yyyy') AS UltimoDiaDoMes;
O FORMAT é mais flexível que o CONVERT, pois aceita qualquer máscara personalizada, mas costuma ter um custo de performance maior em consultas com muitas linhas. Para conversões simples e pontuais, como no exemplo deste post, a diferença não costuma ser perceptível; já em relatórios com grande volume de dados, o CONVERT com estilo numérico tende a ser mais rápido.
Conclusão
Se você está em uma versão atual do SQL Server, EOMONTH é a forma mais simples e direta de obter o último dia do mês. A combinação de DATEADD e DAY continua funcionando em qualquer versão e vale a pena conhecer, mas hoje serve principalmente para bancos legados, sem acesso a EOMONTH.