Banco de Dados - SQL Server

Novos tipos de dados date/time no SQL Server 2008

Neste artigo vamos conhecer os novos tipos de dados date/time, que foram disponibilizados no SQL Server 2008 e como interagir com eles.

por Ronaldo Rossi Conde



Bom pessoal, vamos partir do principio que todos tenham em suas máquinas a versão de avaliação do SQL Server 2008 já instalado e pronto para uso. Caso você ainda não tenha, baixe no site da microsoft no link http://technet.microsoft.com/en-us/bb851664.aspx . A versão de avaliação é grátis e tem validade de 180 dias (versão Enterprise)

Na versão 2008 do SQL Server, temos novos tipos de dados para representarmos valores date/time. Abaixo vou relacionar os que na minha opinião são de grande utilidade para nós desenvolvedores.

- Date : Armazena apenas a data

- Time : Armazena apenas a hora

-DateTimeOffSet : Armazena data, hora e time zone.

Vamos detalhar os tipos de dados para enteder melhor como funcionam e como podem nos ajudar.

Tipo Date e Tipo Time

Acredito que grande parte dos desenvolvedores, já encontrou problemas quando precisou filtrar um relatório pela data. Até a versão 2005 do SQL Server, era comum sermos surpreendidos por um relatório estar omitindo informações. Muitas vezes chegamos a pensar que a query estava errada, ou que o usuário estava passando parametros errado para gerar o relatório, mas quando o grande vilão da história era o campo no formato date/time. Problemas como esquecer de converter a data para o padrão correto, ou mesmo deixarmos a hora como 00:00:00 para o filtro de data, acabaria se tornando uma grande dor de cabeça no futuro.

Para facilitar a vida dos desenvolvedores, o SQL Server 2008 consegue trabalhar com essas informações separadamente. Agora podemos criar em nossas tabelas uma coluna do tipo “date” e uma do tipo “time” e com isso facilitar os filtros nas queries, e também o retorno das informações para o relatório ou para um front end. Não é necessario mais quando se tem as colunas separadas aplicar funções para dividir a informação como a datepart por exemplo.

O exemplo a seguir mostra como funciona o tipo “date” e o tipo “time”

--Declaração das variáveis

declare @TipoDate date

declare @TipoTime time

declare @TipoDateTime datetime

--Populando as variáveis com a data/hora corrente do servidor

set @TipoDate = GETDATE()

set @TipoTime = GETDATE()

set @TipoDateTime = GETDATE()

--Executando o comando select nas variáveis para exibir o valor de cada uma

select @TipoDate Data, @TipoTime Hora, @TipoDateTime Data_Hora

No código acima temos a declaração dos tipos de variáveis que iremos utilizar, nesse exemplo uma do tipo “date”, uma do tipo “time” e a velha conhecida “datetime” para compararmos os resultados.

Neste exemplo foi usado o comando “getdate()” que retorna a data/hora corrente do servidor.

Ao executarmos o comando acima teremos o seguinte resultado

Vamos nos atentar ao valor retornado pela variável “@TipoDateTime”, o valor de retorno dela foi “2009-01-26 23:22:35.407”, agora olhando para as demais variáveis “@TipoDate” e “@TipoTime”, teremos na primeira apenas a data e na segunda apenas a hora. Com isso fica mais fácil para se trabalhar com data e hora, principalmente em grandes volumes de dados onde temos que filtrar pela data/hora as informações.

Tipo DateTimeOffSet

Pense na seguinte situação:

Você um desenvolvedor de sistemas, sua empresa uma multinacional com data center nos Estados Unidos, Asia e Brasil, cada localidade possui uma instalação de SQL Server pois o sistame que acessa a base de dados não controla time zone, sendo assim temos 3 instâncias de SQL Server espalhadas pelo mundo, que necessitam estar separadas devido ao time zone. Cabe a você gerênciar o time zone de cada database, quando for mostrar uma informação no front end, ou então no relatório, a principio parece uma tarefa fácil, mas que na hora de se implementar, acaba virando uma dor de cabeça.

Até a versão 2005 do SQL Server, nós devenvolvedores, tinhamos a árdua tarefa de controlar o time zone, seja via código, ou criando uma tabela para armazenar isso no servidor, e ainda teriamos de enfrentar o problema de acessar 3 servidores diferentes se caso necessário confrontar dados das bases ou sumarizar essas informações em um único relatório. Na versão 2008 do SQL Server temos o tipo de dado chamado “datetimeoffset” que vem para ajudar na tarefa de solucionar, ou facilitar esse problema de time zone. Aplicando o tipo de dado “datetimeoffset” temos como armazenar em uma única instância de SQL Server 2008 todos os time zones necessários, não necessitando a divisão por servidores em data centers diferentes.

No exemplo abaixo podemos ver como o tipo “datetimeoffset” trabalha.

--Declaração das variáveis "datetimeoffset"

DECLARE @dt DATETIMEOFFSET(0)

DECLARE @dt1 DATETIMEOFFSET(0)

--Populando as variáveis com uma data mais o time zone (- ou +) e o time zone em horas

SET @dt = "2007-10-29 22:50:55 -1:00"

SET @dt1 = "2007-10-29 22:50:55 +5:00"

--Exibindo os valores com time zone aplicado e sem timezone aplicado

SELECT @dt Data_Armazenando_Timezone,

cast(@dt as datetime) Data_Sem_Timezone,

dateadd(mi,datepart(tz,@dt),cast(@dt as datetime)) Data_Com_Timezone

SELECT @dt1 Data_Armazenando_Timezone,

cast(@dt1 as datetime) Data_Sem_Timezone,

dateadd(mi,datepart(tz,@dt1),cast(@dt1 as datetime)) Data_Com_Timezone

No código acima, temos a declaração das variáveis “@dt” e “@dt1” como do tipo “datetimeoffset”, atribuimos a mesma data para as duas variáveis, porém na primeira estamos dizendo que o time zone dela é -1:00hr e na segunda que o time zone é de +5:00hs, executando o comando temos o resultado abaixo

Na primeira coluna, temos apenas um print da variável que populamos, na segunda coluna temos um print da mesma variável, porém sem utilizar o time zone, notem que o valor de data e hora se repetem nas duas primeiras colunas, porém na segunda o time zone está sendo omitido. Já na terceira coluna temos o valor da variável com o time zone aplicado, no caso da primeira linha temos a data/hora com o valor “2007-10-29 22:50:55 -01:00”, neste caso o time zone é de menos uma hora, que é o resultado da ultima coluna na primeira linha “2007-10-29 21:50:55.000”. Na segunda linha temos a mesma situação mais o time zone utilizado é de mais 5:00hs, olhando a primeira coluna na segunda linha temos a data/hora “2007-10-29 22:50:55 +05:00” e na ultima coluna da segunda linha temos a data/hora mais o time zone aplicado “2007-10-30 03:50:55.000”.

Atualmente onde trabalho temos esse problema de controlar o time zone, devido a empresa ter diversos data centers espalhados pelo mundo devido a necessidade de controle do time zone fora da aplicação. Com o SQL Server 2008, poderemos centralizar todos os data centers em um só, pois com o tipo de dados “datatimeoffset” é possivél realizar esse controle sem muita complexidade e no caso da minha empresa, ainda gerar uma redução de custo com o uso de vários servidores.

Bom pessoal, fica ai minha contribuição, espero que gostem do artigo e em breve estarei escrevendo um novo para vocês. Fiquem a vontade para fazerem criticas ou sugestões, todo contato é bem vindo.

Abraços

Ronaldo Rossi Conde

ronaldo.conde@terra.com.br

TipoDateotar, que a primeira variemos o seguinte resultado

funsegue trabalhar com essas informaSQL Server 2008

Ronaldo Rossi Conde

Ronaldo Rossi Conde - Database Developer em uma multinacional prestadora de serviços de armazenagem de documentos.
Atualmente trabalhando com SSIS,SSRS,SSAS em SQL Server 2005/2008.