Trabalhando com Datas no SQL Server – Parte 2
Na Parte 1 desta série vimos o básico de manipulação e formatação de datas. Agora vamos ver como obter a data e hora atuais do servidor, como extrair só a parte da data, e um cuidado importante na hora de inserir datas em uma tabela, que costuma gerar bugs difíceis de perceber.
Obtendo a data e hora atuais com GETDATE
A função GETDATE() retorna a data e a hora atuais do servidor onde o SQL Server está instalado:
SELECT GETDATE() AS DataServidor;
Resultado (exemplo):
DataServidor
---------------------------
2026-07-17 20:01:19.957
Uma alternativa com mais precisão: SYSDATETIME
Desde o SQL Server 2008, também é possível usar SYSDATETIME(), que retorna a data e hora com mais casas decimais de precisão (nanossegundos, em vez dos milissegundos de GETDATE):
SELECT SYSDATETIME() AS DataServidor;
Para a maioria dos casos do dia a dia a diferença não importa, mas em cenários que precisam ordenar eventos muito próximos no tempo, essa precisão extra pode fazer diferença.
Obtendo apenas a parte da data
Forma clássica: CONVERT com estilo de formatação
Uma forma de extrair só a data, sem a hora, é converter o valor para VARCHAR usando um estilo de formatação específico:
SELECT CONVERT(VARCHAR, GETDATE(), 101) AS DataServidor;
Resultado:
DataServidor
------------------------------
07/25/2026
O terceiro argumento (101) define o padrão americano de data (mm/dd/aaaa). Existem diversos outros estilos de formatação disponíveis; a documentação oficial da Microsoft mantém a lista completa e atualizada.
Forma recomendada hoje: o tipo DATE
Desde o SQL Server 2008, existe o tipo de dado DATE, que guarda apenas a data, sem hora. Ele costuma ser a opção mais simples quando você só precisa da data, sem formatar como string:
SELECT CAST(GETDATE() AS DATE) AS DataServidor;
A vantagem de usar DATE (em vez de converter para VARCHAR) é que o valor continua sendo um tipo de data de verdade, então ainda pode ser comparado, somado ou usado em cálculos, o que não é possível com uma string.
Formatação flexível com FORMAT (SQL Server 2012+)
Se você precisa de um formato de data personalizado, a função FORMAT, disponível desde o SQL Server 2012, aceita máscaras de formato livres:
SELECT FORMAT(GETDATE(), 'dd/MM/yyyy') AS DataServidor;
Ela é mais flexível que o CONVERT com estilos numéricos, mas tem um custo de performance maior em consultas com muitas linhas, então vale usar com moderação em relatórios grandes.
Inserindo uma data em uma tabela com CONVERT
Para inserir uma data em uma tabela, é comum usar CONVERT para garantir que a string seja interpretada corretamente:
INSERT INTO Tabela (Coluna)
VALUES (CONVERT(DATETIME, '3/15/2004'));
O cuidado mais importante: ambiguidade de formato
Esse é o ponto que mais causa bugs silenciosos ao trabalhar com datas no SQL Server: strings como '3/15/2004' ou '05/03/2026' são ambíguas. O SQL Server interpreta esse tipo de string de acordo com o idioma e as configurações de DATEFORMAT da sessão, o que significa que '05/03/2026' pode virar 5 de março em uma sessão e 3 de maio em outra, dependendo da configuração regional de quem está rodando o comando.
Para evitar esse tipo de problema, prefira formatos de data que sejam sempre interpretados da mesma forma, independentemente da configuração regional da sessão:
-
'YYYYMMDD'(sem separadores, por exemplo'20260315'): é a forma mais segura, sempre interpretada como ano-mês-dia, não importa a configuração de idioma da sessão. -
'YYYY-MM-DD': seguro para os tiposDATEeDATETIME2, mas pode ser interpretado de forma inconsistente com o tipoDATETIMElegado, dependendo da configuração de idioma da sessão.
INSERT INTO Tabela (Coluna)
VALUES (CONVERT(DATE, '20260315'));
Não se esqueça também de verificar o tipo de dado da coluna de destino antes de inserir: uma data compatível com DATE pode falhar ou ser truncada se a coluna for, por exemplo, SMALLDATETIME, que tem uma faixa de datas e uma precisão menores.
Conclusão
GETDATE() continua sendo a forma mais direta de obter a data e hora atuais, com SYSDATETIME() como alternativa quando mais precisão é necessária. Para extrair só a data, o tipo DATE costuma ser mais prático do que converter para VARCHAR. E o cuidado mais importante ao inserir datas como string é evitar formatos ambíguos como 'mm/dd/aaaa', preferindo sempre 'YYYYMMDD' ou 'YYYY-MM-DD', que não dependem da configuração regional da sessão.