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