Sabemos que trabalhar com data e hora no SQL Server não é tão simples quanto parece, iremos ver neste artigo como trabalhar com estes tipos de dados e em seguida abordaremos funções relacionadas a data e hora.

Antes do SQL Server 2008, o SQL Server apenas dava suporte a dois tipos de dados relacionados a data e a hora: DATETIME e SMALLDATETIME, os mesmo trabalham com data e hora em conjunto, com o surgimento do SQL Server 2008 temos os tipos de dados: DATE e TIME separados, DATETIME2 que tem um intervalo de dados maior e uma precisão melhor que DATETIME e DATETIMEOFFSET, este ultimo tem um componente de fuso horário. Veja abaixo com mais detalhes uma tabela informativa dos tipos de dados de data e hora:

Tipos de dados Armazenamento (Bytes) Intervalo de datas Precisão Formato de entrada recomendado e exemplo
DATETIME 8 10 de janeiro de 1753 a 31 de dezembro de 9999 3 1/3 milissegundos ‘AAAAMMDD hh:mm:ss.nnn’ ‘20090212 13:30:15.123’
SMALLDATETIME 4 10 de janeiro de 1990 a 6 de junho de 1979 1 minuto ‘AAAAMMDD hh:mm’ ‘20090212 12:30’
DATE 3 10 de janeiro de 0001 a 31 de dezembro de 9999 1 dia ‘AAAA-MM-DD’
TIME 3 a 5 100 nanossegundos ‘hh:mm:ss.nnnnnnn’ ’12:30:15:1234567’
DATETIME2 6 a 8 10 de janeiro 0001 a 31 de dezembro 9999 100 nanossegundos ‘AAAA-MM-DD hh:mm:ss.nnnnnnn’ ‘2009-02-12 12:30:15.1234567’
DATETIMEOFFSET 8 a 10 10 de janeiro de 0001 a 31 de dezembro de 9999 100 nanossegundos ‘YYY-MM-DD hh:mm:ss.nnnnnnn [+|-] hh:mm’ ‘2009-02-12 12:30:15.1234567 +02:00’

Sobre os requisitos de armazenamento dos últimos três tipos de dados na tabela acima:

TIME, DATETIME2 e DATETIMEOFFSET dependem da precisão que você escolher, ou seja, uma precisão com um número inteiro no intervalo de 0 a 7 que representa a precisão em fração de segundo.

Exemplo:

TIME(0): significa 0 de precisão em fração de segundo, ou seja, um segundo de precisão.
TIME(3): significa uma precisão de um milissegundo.
TIME(7): significa uma precisão de 100 nanossegundos.

Caso não seja especificada uma precisão em fração de segundo, o SQL Server tem como padrão utilizar (7) para os três tipos de dados: TIME, DATETIME2 e DATETIMEOFFSET.

Funções de data e hora

Primeiramente vamos mostrar as funções que retornam data e hora atuais, veja a tabela abaixo:

Função Tipo retornado Descrição Nova no SQL Server 2008
GETDATE DATETIME Data e hora atuais Não
CURRENT_TIMESTAMP DATETIME A mesma GETDATE, porem, ANSI Não
GETUTCDATE DATETIME Data e hora atuais em UTC Não
SYSDATETIME DATETIME2 Data e hora atuais Sim
SYSUTDATETIME DATETIME2 Data e hora atuais em UTC Sim
SYSDATETIMEOFFSET DATETIMEOFFSET Data e hora atuais incluindo fuso horário Sim

Veja o código abaixo demonstrando o uso das funções de data e hora atuais na Listagem 1:

Listagem 1: Exemplo de uso das funções de data e hora atuais


SELECT 
GETDATE()              AS [GETDATE]

SELECT
CURRENT_TIMESTAMP()    AS [CURRENT_TIMESTAMP]

SELECT
GETUTCDATE()           AS [GETUTCDATE]

SELECT
SYSDATETIME()          AS [SYSDATETIME]

SELECT
SYSUTCDATETIME()       AS [SYSUTCDATETIME]

SELECT
SYSDATETIMEOFFSET()    AS [SYSDATETIMEOFFSET] 

Execute um de cada vez, para demonstrar, veja a Figura 1:

Resultado da função GETDATE

Figura 1: Resultado da função GETDATE

Função CAST e CONVERT

Estas funções são utilizadas para converter um valor entre certos tipos de dados.

Sintaxe:

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, irá existir um terceiro argumento aonde você pode especificar o estilo da conversão, com relação ao numero 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”. Para maiores detalhes sobre os numero do estilo, abra o SQL Server Books Online na seção “CAST and CONVERT”.

Função SWITCHOFFSET

Esta função ajusta um valor de entrada DATETIMEOFFSET para um fuso horário especificado.

Sintaxe:

SWITCHOFFSET (valor_de_deslocamentodedataehora.fuso_horario)

Exemplo:

Listagem 2: Exemplo de uso da função SWITCHOFFSET


SELECT SWITCHOFFSET (SYSDATETIMEOFFSET(), '-05:00')

Veja o resultado da função como mostra a Figura 2:

Resultado da função SWITCHOFFSET

Figura 2: Resultado da função SWITCHOFFSET

Função TODATETIMEOFFSET

Esta função define o deslocamento de fuso horário de um valor de data e de hora de entrada.

Sintaxe:

TODATETIMEOFFSET (valor_da_data_e_hora.fuso_horario)

Exemplo:

Listagem 3: Exemplo de uso da função TODATETIMEOFFSET


SELECT TODATETIMEOFFSET (SYSDATETIMEOFFSET(), '-05:00')

Veja o resultado da função como mostra a Figura 3:

 Resultado da função TODATETIMEOFFSET

Figura 3:Resultado da função TODATETIMEOFFSET

Função DATEADD

Esta função permite adicionar um numero especifico de unidades de uma parte relativa a data especificada em um valor de data e hora de entrada.

Sintaxe:

DATEADD (parte, n, valor_data)

Sobre o parâmetro parte os valores validos são: ano, trimestre, mês, dia do ano, dia, semana, dia da semana, hora, minuto, segundo, milissegundo e nanossegundo.

Função DATEDIFF

Esta função retorna a diferença entre dois valores de data e de hora em termos de uma determinada parte da data.

Sintaxe:

DATEDIFF (parte, valor1_data, valor2_data)

Função DATEPART

Esta função retorna um numero inteiro que representa uma parte solicitada de um determinado valor de data e de hora.

Funções 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.

Sintaxe:

YEAR (valor_data)
MONTH (valor_data)
DAY (valor_data)

Função DATENAME

Esta função retorna uma sequencia de caracteres que representa a parte de um determinado valor de data e de hora.

Sintaxe:

DATENAME (parte, valor_data)

Função 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.

Sintaxe:

ISDATE (sequencia)

Com isso finalizo este artigo, espero que as informações transmitidas estejam claras e diretas, até o próximo artigo.

Para maiores detalhes sobre o assunto abordado:http://msdn.microsoft.com/pt- br/library/ms180878(v=sql.105).aspx