分享OLAP的时间维度设计语句

系统 1593 0

时间维度在OLAP中是很常用,我们一般分为日期维度和时刻维度组成。我整理了如何生成他们的语句如下

1)日期维度[Dim_Date]

View Code
        IF EXISTS(
        
          select
        
         * FROM sys.objects WHERE object_id = OBJECT_ID(N
        
          '
        
        
          [dbo].[Dim_Date]
        
        
          '
        
        )AND type 
        
          in
        
        (N
        
          '
        
        
          U
        
        
          '
        
        
          ))

Drop table [dbo].[Dim_Date]

GO

CREATE TABLE [dbo].[Dim_Date](

    DateKey [
        
        
          int
        
        
          ] NOT NULL,

    [TheDate] [datetime] NULL, 
        
        --
        
          DateTime格式的日期

    [TheDateName] [nvarchar](
        
        
          10
        
        )NULL, --
        
          日期名称

    [TheYear] [smallint] NULL,
        
        --
        
          年份

    [TheYearName] [nvarchar](
        
        
          10
        
        )NULL,--
        
          年份名称

    [TheMonth] [smallint] NULL,
        
        --
        
          月份

    [TheMonthName] [nvarchar](
        
        
          10
        
        )NULL,--
        
          月份名称

    [TheDay] [smallint] NULL,
        
        --
        
          日

    [TheDayName] [nvarchar](
        
        
          10
        
        )NULL,--
        
          日的名称

    [TheQuarter] [smallint] NULL,
        
        --
        
          季度

    [TheQuarterName] [nvarchar](
        
        
          10
        
        )NULL,--
        
          季度名称

    [TheWeek] [smallint] NULL,
        
        --
        
          星期

    [TheWeekName] [nvarchar](
        
        
          10
        
        )NULL,--
        
          星期名称  

    [Vacation_Mark] [smallint] NULL,
        
        --
        
          节假日标志

    [TheWW] [smallint] NULL,
        
        --
        
          周

    [TheWWName] [nvarchar](
        
        
          20
        
        ) NULL --
        
          周名称

)ON [PRIMARY]





DECLARE

@DateKey 
        
        
          int
        
        
          ,

@TheDate datetime,

@TheDateName nvarchar(
        
        
          10
        
        
          ),                    

@TheYear smallint,    

@TheYearName nvarchar(
        
        
          10
        
        
          ),

@TheMonth smallint,

@TheMonthName nvarchar(
        
        
          10
        
        
          ),

@TheDay smallint,

@TheDayName nvarchar(
        
        
          10
        
        
          ),

@TheQuarter smallint,

@TheQuarterName nvarchar(
        
        
          10
        
        
          ),

@TheWeek smallint,                    

@TheWeekName nvarchar(
        
        
          10
        
        
          ),

@Vacation_Mark smallint,

@TheWW smallint,

@TheWWName nvarchar(
        
        
          20
        
        
          ),

@dDate DATETIME,
        
        --
        
          存储起始日期和结束日期

@adddays smallint
        
        --
        
          存储日期增量





SELECT @adddays 
        
        = 
        
          1
        
         --
        
          日期增量


        
        --_select @dDate = 
        
          '
        
        
          1/1/2000
        
        
          '
        
        --
        
          当前日期


        
        --WHILE @dDate <= 
        
          '
        
        
          12/31/2010
        
        
          '
        
        --
        
          结束日期

SELECT @dDate 
        
        = 
        
          '
        
        
          1/1/2012
        
        
          '
        
         --
        
          取当前系统时间维度表最大日期

WHILE @dDate 
        
        <= 
        
          '
        
        
          12/31/2012
        
        
          '
        
        --
        
          结束日期:当前日期往后顺延5年,可以根据实际需求设置时长

BEGIN



    
        
        
          select
        
         @DateKey=cast((left(convert(nvarchar,@dDate,
        
          23
        
        ),
        
          4
        
        )+substring(convert(nvarchar,@dDate,
        
          23
        
        ),
        
          6
        
        ,
        
          2
        
        )+
        
          

substring(convert(nvarchar,@dDate,
        
        
          23
        
        ),
        
          9
        
        ,
        
          2
        
        ))
        
          as
        
        
          int
        
        
          )

    SELECT @TheDate 
        
        =
        
           @dDate

    SELECT @TheDateName 
        
        = REPLACE(CONVERT(nvarchar(
        
          20
        
        ),@dDate,
        
          111
        
        ),
        
          '
        
        
          /
        
        
          '
        
        ,
        
          '
        
        
          -
        
        
          '
        
        
          )

    SELECT @TheYear 
        
        =
        
           DATENAME(yy, @dDate)

    SELECT @TheYearName 
        
        = CAST(@TheYear 
        
          as
        
         nvarchar)+
        
          '
        
        
        
          '
        
        
          

    SELECT @TheMonth 
        
        =
        
           DATENAME(mm, @dDate)

    SELECT @TheMonthName 
        
        =CAST(@TheMonth 
        
          as
        
         nvarchar)+
        
          '
        
        
        
          '
        
        
          

    SELECT @TheDay 
        
        =
        
           DATENAME(dd, @dDate)

    SELECT @TheDayName 
        
        = CAST(@TheDay 
        
          as
        
         nvarchar)+
        
          '
        
        
        
          '
        
        
          

    SELECT @TheQuarter 
        
        =
        
           DATENAME(Quarter, @dDate)

    SELECT @TheQuarterName 
        
        = 
        
          '
        
        
        
          '
        
         + CAST(DATENAME(Quarter, @dDate)
        
          as
        
         varchar(
        
          1
        
        ))+
        
          '
        
        
          季度
        
        
          '
        
        
          

    SELECT @TheWeek 
        
        =
        
           DATEPART(dw, @dDate)

    SELECT @TheWeekName 
        
        =
        
           DATENAME(dw,@dDate)

    SELECT @Vacation_Mark 
        
        = CASE WHEN(@TheWeek = 
        
          1
        
         OR @TheWeek = 
        
          7
        
        )THEN 
        
          1
        
         ELSE 
        
          0
        
        
           END

    
        
        
          select
        
         @TheWW=
        
           DATEPART(wk, @dDate)

    
        
        
          select
        
         @TheWWName=
        
          '
        
        
        
          '
        
        +CAST(DATEPART(wk, @dDate)
        
          as
        
         varchar(
        
          2
        
        ))+
        
          '
        
        
        
          '
        
        
            



INSERT INTO Dim_Date(DateKey,TheDate,TheDateName,TheYear,TheYearName,TheMonth,TheMonthName,TheDay,

                        TheDayName,TheQuarter,TheQuarterName,TheWeek,TheWeekName,Vacation_Mark,TheWW,TheWWName)VALUES

(@DateKey,@TheDate, @TheDateName,@TheYear,@TheYearName,@TheMonth,@TheMonthName,@TheDay,@TheDayName,@TheQuarter,

    @TheQuarterName,@TheWeek,@TheWeekName,@Vacation_Mark,@TheWW,@TheWWName)

   SELECT @dDate 
        
        = @dDate +
        
           @adddays

END

GO
        
      

2)时刻维度[Dim_Time]

View Code
        IF EXISTS(
        
          select
        
        * FROM sys.objects WHERE object_id = OBJECT_ID(N
        
          '
        
        
          [dbo].[Dim_Time]
        
        
          '
        
        )AND type 
        
          in
        
        (N
        
          '
        
        
          U
        
        
          '
        
        
          ))

Drop table [dbo].[Dim_Time]

CREATE TABLE [dbo].[Dim_Time](

    [TimeKey]  
        
        
          int
        
         IDENTITY(
        
          1
        
        ,
        
          1
        
        
          )NOT NULL,

    [TheHour]  smallint NULL, 
        
        --
        
          小时

    [TheHourName] nvarchar(
        
        
          5
        
        ) NULL,--
        
          小时名称

    [HalfHour] smallint NULL, 
        
        --
        
          半小时

    [HalfHourName] nvarchar(
        
        
          10
        
        )NULL, --
        
          半小时名称

    [Min] smallint NULL, 
        
        --
        
          分钟

    [minName] nvarchar(
        
        
          10
        
        )NULL --
        
          分钟名称

)ON [PRIMARY]

DECLARE

@dHour smallint,

@addhours smallint,

@chour nvarchar(
        
        
          5
        
        
          ),

@dhhour smallint,

@hhourname nvarchar(
        
        
          10
        
        
          ),

@dMin smallint,

@dMinName nvarchar(
        
        
          10
        
        
          )


        
        
          select
        
         @dHour = 
        
          0
        
               --
        
          起始小时


        
        
          select
        
         @dhhour = 
        
          1
        
              --
        
          起始半小时


        
        
          select
        
         @dmin = 
        
          0
        
                --
        
          起始分钟

WHILE  @dHour 
        
        <= 
        
          23
        
        
          

BEGIN

   WHILE @dmin 
        
        <=
        
          59
        
        
          

         BEGIN

          
        
        
          select
        
         @dhhour =
        
          

        CASE

        WHEN @dMin 
        
        >=
        
          0
        
          and @dMin <=
        
          29
        
          THEN 
        
          1
        
        
          

        WHEN @dMin 
        
        >=
        
          30
        
         and @dMin <=
        
          59
        
          THEN 
        
          2
        
        
           END

          
        
        
          select
        
         @hhourname =
        
          

        CASE

        WHEN @dhhour 
        
        =
        
          1
        
          THEN 
        
          '
        
        
          前半小时
        
        
          '
        
        
          

        WHEN @dhhour 
        
        =
        
          2
        
          THEN 
        
          '
        
        
          后半小时
        
        
          '
        
        
           END

        
        
        
          select
        
         @dMinName = cast(@dhour 
        
          as
        
         nvarchar)+
        
          '
        
        
          :
        
        
          '
        
        +(
        
          case
        
         when len(@dmin)=
        
          1
        
         then(
        
          '
        
        
          0
        
        
          '
        
        +cast(@dmin 
        
          as
        
        
           nvarchar))       

         
        
        
          else
        
         cast(@dmin 
        
          as
        
        
           nvarchar)end)

         
        
        
          select
        
         @chour = cast(@dhour 
        
          as
        
         nvarchar)+ 
        
          '
        
        
          :00
        
        
          '
        
        
          

insert INTO Dim_Time(TheHour,TheHourName,HalfHour,HalfHourName,Min,MinName)VALUES

       (@dHour,@chour,@dhhour,@hhourname,@dMin,@dMinName)

        
        
        
          select
        
         @dMin = @dMin + 
        
          1
        
        
          

        END


        
        
          select
        
         @dmin = 
        
          0
        
        
          select
        
         @dHour = @dHour + 
        
          1
        
        
          

END

GO
        
      

分享OLAP的时间维度设计语句


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论