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