Esse artigo faz parte da revista SQL Magazine edição 47. Clique aqui para ler todos os artigos desta edição

Imagem

N>

Construa geradores de data e manipule data e hora no SQL Server

 

Às vezes você necessita gerar seqüências de valores de data e/ ou hora. Por exemplo, imagine um data warehouse com sua estrutura multidimensional e armazenando as medidas e dimensões em tabelas fato e dimensão. Já que uma das dimensões é praticamente sempre a dimensão tempo, você necessitaria gerar a seqüência de valores de data (hora) e carregá-los na tabela de dimensão de hora. Este artigo demonstra como construir geradores de data usando o SQL. Além disto, ele mostrará algumas técnicas úteis que podem ajudá-lo a manipular dados de data e hora.

 

Geradores de data

Primeiro, vamos criar e carregar uma tabela auxiliar que consiste de uma coluna do tipo integer .

 

Listagem 1. Criando e carregando a tabela auxiliar.

SET NOCOUNT ON;

DECLARE

@startDate smalldatetime, @endDate smalldatetime, @i int;

 SELECT @i = 1,

 @startDate = ‘Jan 01, 2007’,

 @endDate = DATEADD(yy, 1, @startDate);

  IF EXISTS(SELECT * FROM sysobjects

  WHERE ID = (OBJECT_ID(‘dbo.sequence’)) AND xtype = ‘U’)

  DROP TABLE dbo.sequence;

  CREATE TABLE dbo.sequence(num int NOT NULL);

   WHILE(@i <= (SELECT DATEDIFF(dd, @startDate, @endDate)))

    BEGIN

    INSERT INTO dbo.sequence VALUES(@i);

    SET @i = @i + 1;

   END

 

 Você pode usar o SQL para gerar seqüências de números de diversas maneiras. O código da Listagem 1 mantém as coisas sem complicações usando um loop simples.A quantidade de números (365) na tabela auxiliar é igual ao número de dias no ano 2007 e foram calculados automaticamente usando a função DATEDIFF  do SQL Server. Agora, você pode gerar a seqüência de dias no ano 2007 como mostrado na Listagem 2.

 

Listagem 2. Gerando a seqüência de dias do ano 2007.

DECLARE

@iniDate smalldatetime;

  SELECT @iniDate = ‘Dec 31, 2006’;

  SELECT DATEADD(dd, num, @iniDate) DayOfYear

   FROM sequence;

   DayOfYear

-----------------------

2007-01-01 00:00:00

2007-01-02 00:00:00

2007-01-03 00:00:00

2007-01-04 00:00:00

. . . . . . . . . .

2007-12-27 00:00:00

2007-12-28 00:00:00

2007-12-29 00:00:00

2007-12-30 00:00:00

...

Quer ler esse conteúdo completo? Tenha acesso completo