Dica – Criando um Calendário no SQL Server 2008 e SQL Server 2008 R2.

Galera, boa tarde.

Tudo bem?

Estou de volta com mais uma dica para você, hoje algo bastante simples, mas que pode ajudar em muito.

Há algum tempo andei atrás em uma das minhas consultorias, um dos meus clientes acabou me solicitando algo bastante diferente em relação ao SQL Server. Quando ele me solicitou para criar um Calendário Mensal de Datas no SQL Server, sinceramente pensei nossa fazer isso em um banco de dados é algo um pouco estranho.

Mas tudo bem, cliente é cliente e comecei a pensar como poderia fazer isso, como também, a pesquisar algumas fontes de informações e referência. Após um bom tempo de testes e muita pesquisa, consegui montar uma estrutura que consiga simular um Calendário de Datas de acordo com o período informado pelo usuário.

A seguir, apresento o Código 1, utilizado para Criação do Calendário, como também, para inserção de dados no Calendário.

– Código 1 – Criando Calendário Mensal de Dados –

Set Nocount On

Set DateFirst 7

Set DateFormat DMY

 

Declare @Calendario Table

 (Semana Int Identity(1,1) ,

  Segunda SmallInt Default null,

  Terca SmallInt Default null, 

  Quarta SmallInt Default null,

  Quinta SmallInt Default null,

   Sexta SmallInt Default null,

   Sabado SmallInt Default Null,

   Domingo SmallInt Default Null)

 

Declare @DataInicial Date

Declare @DataFinal  Date

Declare @Semana  Int

 

Select @DataInicial = ’01/02/2012′ , @DataFinal = ’29/02/2012′, @Semana = 1

 

While @DataInicial <= @DataFinal

Begin

  Insert into @Calendario Default Values

 

  While 1=1

     Begin 

       Update @Calendario

        Set Segunda = Case When DatePart(WeekDay,@DataInicial) = 2 Then DatePart(Day,@DataInicial) Else Segunda End,

              Terca = Case When DatePart(WeekDay,@DataInicial) = 3 Then DatePart(Day,@DataInicial) Else Terca End,

              Quarta = Case When DatePart(WeekDay,@DataInicial) = 4 Then DatePart(Day,@DataInicial) Else Quarta End,

              Quinta = Case When DatePart(WeekDay,@DataInicial) = 5 Then DatePart(Day,@DataInicial) Else Quinta End,

              Sexta = Case When DatePart(WeekDay,@DataInicial) = 6 Then DatePart(Day,@DataInicial) Else Sexta End,

              Sabado = Case When DatePart(WeekDay,@DataInicial) = 7 Then DatePart(Day,@DataInicial) Else Sabado End,

              Domingo = Case When DatePart(WeekDay,@DataInicial) = 1 Then DatePart(Day,@DataInicial) Else Domingo End    

       Where Semana = @Semana

       And DatePart(Month,@DataInicial) =  DatePart(Month,@DataFinal)

      If DatePart(WeekDay,@DataInicial) = 1

       Break

         Select @DataInicial = Dateadd(Day,1,@DataInicial)

      End

     Select @DataInicial = Dateadd(Day,1,@DataInicial)

     Set @Semana = @Semana + 1

End

 

Select * From @Calendario

 

O segredo deste código encontra-se na execução do Comando Update em conjunto com o Comando Case, ambos, destacados a seguir:

 

       Update @Calendario

        Set Segunda = Case When DatePart(WeekDay,@DataInicial) = 2 Then DatePart(Day,@DataInicial) Else Segunda End,

              Terca = Case When DatePart(WeekDay,@DataInicial) = 3 Then DatePart(Day,@DataInicial) Else Terca End,

              Quarta = Case When DatePart(WeekDay,@DataInicial) = 4 Then DatePart(Day,@DataInicial) Else Quarta End,

              Quinta = Case When DatePart(WeekDay,@DataInicial) = 5 Then DatePart(Day,@DataInicial) Else Quinta End,

              Sexta = Case When DatePart(WeekDay,@DataInicial) = 6 Then DatePart(Day,@DataInicial) Else Sexta End,

              Sabado = Case When DatePart(WeekDay,@DataInicial) = 7 Then DatePart(Day,@DataInicial) Else Sabado End,

              Domingo = Case When DatePart(WeekDay,@DataInicial) = 1 Then DatePart(Day,@DataInicial) Else Domingo End    

       Where Semana = @Semana

       And DatePart(Month,@DataInicial) =  DatePart(Month,@DataFinal)

Neste bloco de código, estamos realizando a atualização de cada Registro inserido na variável table @Calendario, fazendo a análise para identificar em qual dia da semana e também em qual semana do mês os valores estão sendo acumulados. Para também esta sendo utilizado a Função DatePart em conjunto com as opções Day, WeekDay e Month.

A Figura 1 ilustra como nosso Calendário é criado no SQL Server:

Figura 1 – Calendário Mensal criado no SQL Server.

Bom pessoal, é isso, vou encerrar este dica aqui.

Espero que todos tenham gostado.

Encontramos-nos em breve.

Até mais.

Deixe um comentário

5 Comentários

  1. Olha esse:
    http://sqlfromhell.wordpress.com/2010/09/08/sql-calendar/

    Normalmente uso ele como desafio nas aulas de CTE e PIVOT.

    Responder
  2. Jeff Posz - Estudante de SQL Server

     /  23 de fevereiro de 2012

    Nossa q coisa de louco… mas gostei muito da dica..

    Responder

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Join 418 other followers