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.

Paulo R. Pereira
/ 16 de fevereiro de 2012Olha esse:
http://sqlfromhell.wordpress.com/2010/09/08/sql-calendar/
Normalmente uso ele como desafio nas aulas de CTE e PIVOT.
Junior Galvão - MVP
/ 16 de fevereiro de 2012Paulo, boa tarde.
Show, muito legal, vou guardar na minha biblioteca de códigos.
Até mais.
Jeff Posz - Estudante de SQL Server
/ 23 de fevereiro de 2012Nossa q coisa de louco… mas gostei muito da dica..
Junior Galvão - MVP
/ 23 de fevereiro de 2012Jeff, boa noite.
Obrigado, espero ter ajudado.
Junior Galvão - MVP
/ 26 de fevereiro de 2012Obrigado.