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:
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:
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:
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