N√£o h√° praticamente nenhum banco de dados OLAP sem uma dimens√£o de tempo.

Geralmente uma dimens√£o de tempo cont√©m dias como o n√≠vel mais baixo de detalhes, agregados em meses, trimestres e anos. Ocasionalmente, se estiver monitorando um processo de fabrica√ß√£o ou atividade de internet em particular, voc√™ poderia criar uma dimens√£o com minutos ou mesmo segundos como o n√≠vel mais baixo de detalhes. ¬†Qualquer que seja o n√≠vel de detalhes, uma dimens√£o de tempo possui certas qualidades √ļnicas.

¬†Por exemplo, o tempo normalmente ocorre em intervalos regulares, Cada hora tem 60 minutos, cada dia tem 24 horas. ¬†√Č claro, o tempo n√£o √© completamente uniforme porque os 365 dias de um ano n√£o s√£o perfeitamente divis√≠veis por 7 dias de uma semana ou pelos 12 meses de um ano. Alguns meses tem 30 dias, alguns 31 ou 28 e ocasionalmente 29. Irregularidades s√£o fatos da vida nas dimens√Ķes de tempo e ao trabalhar com tempo, voc√™ precisar√° estar preparado para regularidades e irregularidades.

Resolvi criar um Script para criação da Dimensão Tempo para facilitar:

CREATE TABLE [DimTempo](
      [Data] [smalldatetime] NOT NULL Primary Key,
      [Ano] [smallint] NOT NULL,
      [DataCurta] [char](10) NOT NULL,
      [DiaSemana] [varchar](15) NOT NULL,
      [DiaMes] [smallint] NOT NULL,
      [MesNome] [varchar](10) NOT NULL,
      [MesNumero] [smallint] NOT NULL,
      [Trimestre] [smallint] NOT NULL,
      [Semestre] [smallint] NOT NULL
)
GO
SET LANGUAGE Brazilian
Set nocount ON
DECLARE @Ano smallint
DECLARE @Data smalldatetime
DECLARE @DataIni smalldatetime
DECLARE @DataFim smalldatetime
DECLARE @DataCurta char(10)
DECLARE @DiaSemana varchar(15)
DECLARE @DiaMes smallint
DECLARE @MesNome varchar(10)
DECLARE @MesNumero smallint
DECLARE @Trimestre smallint
DECLARE @Semestre smallint
SET @DataIni='01/01/2005'
SET @DataFim='31/12/2020'
SET @Data=@DataIni
While @Data<=@DataFim
Begin
     Set @DataCurta = convert(char(10), @Data, 103)
     Set @DiaSemana = datename(weekday,@Data)
     Set @DiaMes = day(@Data)
     Set @MesNome = datename(month,@Data)
     Set @MesNumero = month(@Data)
     Set @Trimestre = DATEPART(quarter,@Data)
     Select @Semestre= Case 
          when @MesNumero in (1,2,3,4,5,6) then 1
          when @MesNumero in (7,8,9,10,11,12) then 2
     End
     Set @Ano = YEAR(@Data)
     INSERT INTO DimTempo values(@Data, @Ano, @DataCurta, @DiaSemana, @DiaMes, @MesNome, @MesNumero, @Trimestre, @Semestre)
     Set @Data=dateadd(day,1,@Data)
End
Set nocount OFF

Verifique como ficou:

SELECT * FROM DimTempo