|

Como Exibir o Último Dia do Mês Atual no Formato DD/MM/YYYY (SQL Server)

Compartilhe :

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:

  1. DATEADD(MONTH, 1, GETDATE()) avança a data atual em um mês.
  2. DAY(GETDATE()) pega o dia atual do mês (por exemplo, 17).
  3. 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.

Posts Similares