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 CondeBom 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
TipoDateotar, que a primeira variemos o seguinte resultado
funsegue trabalhar com essas informaSQL Server 2008
- Representando dados em XML no SQL ServerSQL Server
- Diferenças entre SEQUENCES x IDENTITY no Microsoft SQL Server 2012SQL
- Utilizando FILETABLE no SQL Server 2012SQL Server
- NHibernate com o Delphi Prism: Acessando um Banco de Dados SQL ServerVisual Studio
- Novidades no SQL Server Codinome DenaliSQL Server