quarta-feira, 15 de junho de 2016

Populando dimensão tempo no SQL Server 2012



Populando dimensão tempo no SQL Server 2012 

Neste vídeo demonstro como gerar script para criar tabelas do DW, no ERwin data modeler 7.3 e populo a dimensão tempo com uma procedure que estarei disponibilizando no BLOG da Q-TI.

Script:
--criar tabela dimensao tempo

CREATE TABLE DIM_TEMPO(
 SK_TEMPO int IDENTITY(1,1) NOT NULL PRIMARY KEY,
 DATA date NOT NULL,
 ANO smallint NOT NULL,
 MES smallint NOT NULL,
 DIA smallint NOT NULL,
 DIA_SEMANA smallint NOT NULL,
 DIA_ANO smallint NOT NULL,
 ANO_BISSEXTO char(1) NOT NULL,
 DIA_UTIL char(1) NOT NULL,
 FIM_SEMANA char(1) NOT NULL,
 FERIADO char(1) NOT NULL,
 PRE_FERIADO char(1) NOT NULL,
 POS_FERIADO char(1) NOT NULL,
 NOME_FERIADO nvarchar(30) NULL,
 NOME_DIA_SEMANA nvarchar(15) NOT NULL,
 NOME_DIA_SEMANA_ABREV char(3) NOT NULL,
 NOME_MES nvarchar(15) NOT NULL,
 NOME_MES_ABREV char(3) NOT NULL,
 QUINZENA smallint NOT NULL,
 BIMESTRE smallint NOT NULL,
 TRIMESTRE smallint NOT NULL,
 SEMESTRE smallint NOT NULL,
 NR_SEMANA_MES smallint NOT NULL,
 NR_SEMANA_ANO smallint NOT NULL,
 ESTACAO_ANO varchar(15) NOT NULL,
 DATA_POR_EXTENSO varchar(50) NOT NULL)


------ procedure para inserir na dim_tempo

Create procedure ISP_insertDimTempo
@dataInicial date, @dataFinal date
as
begin
declare  @data date, 
@ano smallint, @mes smallint, @dia smallint, 
@diaSemana smallint, @diaUtil char(1), @fimSemana char(1), 
@feriado char(1), @preFeriado char(1), @posFeriado char(1), 
@nomeFeriado varchar(30), @nomeDiaSemana varchar(15), 
@nomeDiaSemanaAbrev char(3), @nomeMes varchar(15), 
@nomeMesAbrev char(3), @bimestre smallint, @trimestre smallint, 
@nrSemanaMes smallint, @estacaoAno varchar(15), 
@dataPorExtenso varchar(50)
/*Nao utilizado mais
--informe aqui o período para o qual deseja criar os dados
--set @dataInicial = '01/01/2012'
--set @dataFinal = '31/12/2012'
*/
while @dataInicial <= @dataFinal
begin
set @data = @dataInicial
set @ano = year(@data)
set @mes = month(@data)
set @dia = day(@data)
set @diaSemana = datepart(weekday,@data)
--verifica se é fim de semana ou semana
if @diaSemana in (1,7) 
set @fimSemana = 'S'
else set @fimSemana = 'N'
/* feriados locais/regionais e aqueles que não possuem data fixa 
(carnaval, páscoa e corpus cristis) tb devem ser adicionados aqui */
--nome feriado fixo
if (@mes = 1 and @dia in (1,2)) or (@mes = 12 and @dia = 31) --confraternização universal
set @nomeFeriado = 'confraternização universal'
else 
if (@mes = 4 and @dia in (20,21,22)) --tiradentes
set @nomeFeriado = 'tiradentes'
else 
if (@mes = 5 and @dia in (1,2))or (@mes = 4 and @dia = 30) --dia do trabalho
set @nomeFeriado = 'dia do trabalho'
else 
if (@mes = 9 and @dia in (6,7,8)) --independência do brasil
set @nomeFeriado = 'independência do brasil'
else 
if (@mes = 10 and @dia in (11,12,13)) --nossa senhora aparecida
set @nomeFeriado = 'nossa senhora aparecida'
else
if (@mes = 11 and @dia in (1,2,3)) --finados
set @nomeFeriado = 'finados'
else
if (@mes = 11 and @dia in (14,15,16)) --proclamação da república
set @nomeFeriado = 'proclamação da república'
else
if (@mes = 12 and @dia in (24,25,26)) --natal
set @nomeFeriado = 'natal'
else set @nomeFeriado = null
--pre feriado
if (@mes = 12 and @dia = 31) or --confraternização universal
(@mes = 4 and @dia = 20) or --tiradentes
(@mes = 4 and @dia = 30) or --dia do trabalho
(@mes = 9 and @dia = 6) or --independência do brasil
(@mes = 10 and @dia = 11) or --nossa senhora aparecida
(@mes = 11 and @dia = 1) or --finados
(@mes = 11 and @dia = 14) or --proclamação da república
(@mes = 12 and @dia = 24) --natal
set @preFeriado = 'S'
else set @preFeriado = 'N'
--feriado
if (@mes = 1 and @dia = 1) or --confraternização universal
(@mes = 4 and @dia = 21) or --tiradentes
(@mes = 5 and @dia = 1) or --dia do trabalho
(@mes = 9 and @dia = 7) or --independência do brasil
(@mes = 10 and @dia = 12) or --nossa senhora aparecida
(@mes = 11 and @dia = 2) or --finados
(@mes = 11 and @dia = 15) or --proclamação da república
(@mes = 12 and @dia = 25) --natal
set @feriado = 'S'
else set @feriado = 'N'
--pos feriado
if (@mes = 1 and @dia = 2) or --confraternização universal
(@mes = 4 and @dia = 22) or --tiradentes
(@mes = 5 and @dia = 2) or --dia do trabalho
(@mes = 9 and @dia = 8) or --independência do brasil
(@mes = 10 and @dia = 13) or --nossa senhora aparecida
(@mes = 11 and @dia = 3) or --finados
(@mes = 11 and @dia = 16) or --proclamação da república
(@mes = 12 and @dia = 26) --natal
set @posFeriado = 'S'
else set @posFeriado = 'N'
--identicar mes
set @nomeMes = case when @mes = 1 then 'janeiro'
when @mes = 2 then 'fevereiro'
when @mes = 3 then 'março'
when @mes = 4 then 'abril'
when @mes = 5 then 'maio'
when @mes = 6 then 'junho'
when @mes = 7 then 'julho'
when @mes = 8 then 'agosto'
when @mes = 9 then 'setembro'
when @mes = 10 then 'outubro'
when @mes = 11 then 'novembro'
when @mes = 12 then 'dezembro' end
--nome mes abreviado
set @nomeMesAbrev = case when @mes = 1 then 'jan'
when @mes = 2 then 'fev'
when @mes = 3 then 'mar'
when @mes = 4 then 'abr'
when @mes = 5 then 'mai'
when @mes = 6 then 'jun'
when @mes = 7 then 'jul'
when @mes = 8 then 'ago'
when @mes = 9 then 'set'
when @mes = 10 then 'out'
when @mes = 11 then 'nov'
when @mes = 12 then 'dez' end
--identicar dia util
if @fimSemana = 'S' or @feriado = 'S'
set @diaUtil = 'N'
else set @diaUtil = 'S'
--identificar dia da semana
set @nomeDiaSemana = case when @diaSemana = 1 then 'domingo'
when @diaSemana = 2 then 'segunda-feira'
when @diaSemana = 3 then 'terça-feira'
when @diaSemana = 4 then 'quarta-feira'
when @diaSemana = 5 then 'quinta-feira'
when @diaSemana = 6 then 'sexta-feira'
else 'sábado' end
--identificar dia da semana abreviado
set @nomeDiaSemanaAbrev = case when @diaSemana = 1 then 'dom'
when @diaSemana = 2 then 'seg'
when @diaSemana = 3 then 'ter'
when @diaSemana = 4 then 'qua'
when @diaSemana = 5 then 'qui'
when @diaSemana = 6 then 'sex'
else 'sáb' end
--identificar bimestre
set @bimestre = case when @mes in (1,2) then 1
when @mes in (3,4) then 2
when @mes in (5,6) then 3
when @mes in (7,8) then 4
when @mes in (9,10) then 5
else 6 end
--identicar trimestre
set @trimestre = case when @mes in (1,2,3) then 1
when @mes in (4,5,6) then 2
when @mes in (7,8,9) then 3
else 4 end
--identificar numero da semana
set @nrSemanaMes = case when @dia < 8 then 1
when @dia < 15 then 2
when @dia < 22 then 3
when @dia < 29 then 4
else 5 end
--identificar estacao do ano no Brasil
if @data between cast('23/09/'+convert(char(4),@ano) as date) and cast('20/12/'+convert(char(4),@ano) as date)
set @estacaoAno = 'primavera'
else if @data between cast('21/03/'+convert(char(4),@ano) as date) and cast('20/06/'+convert(char(4),@ano) as date)
set @estacaoAno = 'outono'
else if @data between cast('21/06/'+convert(char(4),@ano) as date) and cast('22/09/'+convert(char(4),@ano) as date)
set @estacaoAno = 'inverno'
else -- @data between 21/12 e 20/03
set @estacaoAno = 'verão'
--insert
INSERT INTO DIM_TEMPO
SELECT @data
,@ano
,@mes
,@dia
,@diaSemana
,datepart(dayofyear,@data) --DIA_ANO
,case when (@ano % 4) = 0 then 'S' else 'N' end -- ANO_BISSEXTO
,@diaUtil
,@fimSemana
,@feriado
,@preFeriado
,@posFeriado
,@nomeFeriado
,@nomeDiaSemana
,@nomeDiaSemanaAbrev
,@nomeMes
,@nomeMesAbrev
,case when @dia < 16 then 1 else 2 end -- QUINZENA
,@bimestre
,@trimestre
,case when @mes < 7 then 1 else 2 end -- SEMESTRE
,@nrSemanaMes
,datepart(wk,@data)--NR_SEMANA_ANO, smallint
,@estacaoAno
,lower(@nomeDiaSemana + ', ' + cast(@dia as varchar) + ' de ' + @nomeMes + ' de ' + cast(@ano as varchar))
set @dataInicial = dateadd(day,1,@dataInicial) 
end
end
--executar pprocedure 
exec ISP_insertDimTempo '1990-01-01','2050-12-12'

Youtube: Q-TI Suporte
E-mail : qti.suporte@gmail.com
Facebook : Facebook.com/Q-TI Suporte
Instagram: Instagram/qti.suporte

2 comentários:

  1. esta errado o numero da semana mes.

    --identificar numero da semana
    set @nrSemanaMes = case when @dia < 8 then 1
    when @dia < 15 then 2
    when @dia < 22 then 3
    when @dia < 29 then 4
    else 5 end

    Exemplo: dia 5/08/2019 é uma segunda feira da segunda semana e se fizer esse calculo vai dizer que é a primeira semana.

    obs. assim que eu chegar em alguma formula tentarei contribuir tambem.
    Obrigado.

    ResponderExcluir
    Respostas
    1. set @nrSemanaMes = (DAY(@dataInicial) +
      (DATEPART(dw, DATEADD (month, DATEDIFF (month, 0, @dataInicial), 0)) -- The day of the week for the first day of month
      -1) -- # of days to add to make the first week full 7 days
      -1)/7 + 1


      Pelo que vi aqui funcionou

      Excluir