Funções de data e hora no SQL Server
Neste post, vamos conhecer várias funções que tratam de data e hora no SQL Server.
Datatypes
O SQL Server possui vários datatypes para data e hora:
GETDATE() e similares
Estas funções retornam a data e a hora do computador no qual a instância do SQL Server é executada:
Vamos ver essas funções em ação:
Observe que a hora retornada pelas funções GetDate(), SysDatetime() e Current_TimeStamp é diferente do retorno de GetUTCDate(), SysUTCDateTime e SysDateTimeOffset. Por quê? O resultado destas três funções é retornado como hora UTC (Tempo Universal Coordenado).
CAST e CONVERT
Estas funções são utilizadas para converter um valor entre certos tipos de dados.
CAST (valor AS tipo de dados)
CONVERT (tipo de dados, valor [numero_de_estilo])
As duas funções convertem o valor de saída no tipo de dados especificado. Na função CONVERT, em alguns casos, teremos um terceiro argumento aonde você pode especificar o estilo da conversão, com relação ao número do estilo, este indica que quando for necessária a conversão de data e hora para uma sequencia de caracteres ou vice-versa, deve ser obedecido certo estilo. Por exemplo, o estilo 103 indica “MM/DD/AAAA” e o numero do estilo 101 indica “MMDDAAAA”.
Neste script, temos todos os estilos de CONVERT:
DATEPART
Esta função retorna um número que representa a parte solicitada de um determinado valor de data e de hora.
DATEPART (parte, data)
Os valores aceitáveis para o parâmetro parte são:
SWITCHOFFSET e TODATETIMEOFFSET
A função SWITHOFFSET ajusta a data/hora passada de acordo com o fuso horário informado. Já TODATETIMEOFFSET mantém a data/hora e acrescenta o fuso horário informado.
SWITCHOFFSET (data e hora, fuso horário)
TODATETIMEOFFSET (data e hora, fuso horário)
DATEADD
Esta função permite adicionar um número específico de unidades de uma parte relativa a data especificada em um valor de data e hora de entrada.
DATEADD (parte, n, data)
Os valores aceitáveis para o parâmetro parte são:
DATEDIFF
Esta função retorna a diferença numérica entre duas datas, considerando uma determinada parte da data.
DATEDIFF (parte, data 1, data 2)
Normalmente, definimos que a Data 1 será menor que a Data 2, para retornarmos um valor positivo. Se Data 1 for maior que Data 2, o resultado da função será negativo.
Os valores aceitáveis para o parâmetro parte são:
Segue exemplo de cálculo de horas, onde precisamos exibir o número de horas, minutos e segundos de diferença entre as duas datas.
YEAR, MONTH e DAY
Estas funções são abreviações da função DATEPART e retornam a representação de inteiro das partes relativas a ano, mês e dia de um valor de data e de hora de entrada.
YEAR (data)
MONTH (data)
DAY (data)
DATENAME
Esta função retorna uma sequência de caracteres que representa a parte de um determinado valor de data e de hora.
DATENAME (parte, valor_data)
Os valores aceitáveis para o parâmetro parte são:
Só um detalhe, a função retornará o nome no idioma do servidor. Por isso o resultado acima está em inglês. Para ter o resultado em português, podemos utilizar o comando:
SET LANGUAGE 'Brazilian'
Obs. 1: No SQL Server, o idioma Brasileiro existe e funciona melhor que o português!
Obs. 2: A troca do idioma utilizando SET LANGUAGE é válida apenas durante a sessão.
Para ver uma lista dos idiomas disponíveis, utilize a view:
SELECT * FROM syslanguages
ISDATE
Esta função aceita uma sequencia de caracteres como entrada e retorna 1 caso ela seja conversível em tipo de dados de data e de hora e, caso contrario, retorna 0.
ISDATE (valor)
EOMONTH
A função EOMONTH retorna o último dia do mês que contém a data especificada com um deslocamento opcional.
EOMONTH (data [, qtd meses a acrescentar] )
DATEFROMPARTS
A função DATEFROMPARTS() foi implementada a partir da versão 2012 do SQL Server, ela constrói uma data e retorna um DATE baseado no ano, mês e dia passados como parâmetro.
DATEFROMPARTS(ano, mês, dia)
Calculando datas
Estes exemplos combinam as funções de datas para calcular algumas informações:
Dica bônus
Embora não seja uma função de data e hora, eu uso CHOOSE sempre que preciso do nome do mês, sem a necessidade de mudar a linguagem do SQL Server.
E se você precisar converter uma data AAAA/MM/DD para MM/AAAA, um truque muito util é usar RIGHT para garantir o zero à esquerda do mês.