使用存储过程创建日期维度



CREATE PROCEDURE [dbo].[pBuildDim_Date]
(
    @StartYear int = 1998
    ,@NumYears int = 15
)
AS


DECLARE
    @TmpDate smalldatetime
    ,@EndDate smalldatetime
    ,@LastModDate smalldatetime

SET DATEFIRST 1 -- Week starts on Monday
SET @TmpDate = CONVERT(smalldatetime, ('1/1/' + CONVERT(varchar(4), @StartYear)))
SET @EndDate = DATEADD(yyyy, @NumYears, @TmpDate - 1)
SET @LastModDate = GETDATE()

-- Remove all members.
TRUNCATE TABLE dbo.DimDate

-- Add member to represent unknown or default.
INSERT INTO dbo.DimDate
(
    DateKey
    ,[Date]
    ,YYYYMMDD
    ,[DateName]
    ,[Year]
    ,[Q]
    ,[Qtr]
    ,[Quarter]
    ,[QuarterName]
    ,[MM]
    ,[Mon]
    ,[Month]
    ,[MonthName]
    ,[DD]
    ,[Dy]
    ,[Day]
    ,[DayOfWeek]
    ,[Julian]
    ,[WeekKey]
    ,[Week]
    ,[WeekName]
    ,[Weekend]
    ,YearKey
    ,MoKey
    ,MMMYY
    ,MMMDD
    ,DayActive
    ,HolidayFlag
    ,DTM
)
VALUES
(
    19000101 -- DateKey
    ,'1900-01-01' -- Date
    ,'19000101' -- YYYYMMDD
    ,'01/01/1900' -- DateName
    ,1900 -- Year
    ,0 -- Q
    ,'Q0-00' -- Qtr
    ,'Quarter 0' -- Quarter
    ,'Q0CY00' -- QuarterName
    ,0 -- MM
    ,'NA' -- Mon
    ,'NA' -- Month
    ,'NONE' -- MonthName
    ,0 -- DD
    ,'NA' -- Dy
    ,'NONE' -- Day
    ,0 -- DayOfWeek
    ,0 -- Julian
    ,0 -- WeekKey
    ,0 -- Week
    ,'NONE' -- WeekName
    ,0 -- WeekEnd
    ,-1 -- YearKey
    ,190001 -- MoKey
    ,'NONE' -- MMMYY
    ,'NONE' -- MMMDD
    ,0 -- DayActive
    ,0 -- HolidayFlag (not specified)
    ,@LastModDate -- DTM
)    

-- Add regular date members.
WHILE @TmpDate <= @EndDate
BEGIN
    INSERT INTO dbo.DimDate
    (
        DateKey
        ,[Date]
        ,YYYYMMDD
        ,[DateName]
        ,[Year]
        ,[Q]
        ,[Qtr]
        ,[Quarter]
        ,[QuarterName]
        ,[MM]
        ,[Mon]
        ,[Month]
        ,[MonthName]
        ,[DD]
        ,[Dy]
        ,[Day]
        ,[DayOfWeek]
        ,[Julian]
        ,[WeekKey]
        ,[Week]
        ,[WeekName]
        ,[Weekend]
        ,YearKey
        ,MoKey
        ,MMMYY
        ,MMMDD
        ,DayActive
        ,HolidayFlag
        ,DTM
    )
    VALUES
    (
        CONVERT(int, CONVERT(nchar(8), @TmpDate, 112)) -- DateKey
        ,@TmpDate -- Date
        ,CONVERT(nchar(8), @TmpDate, 112) -- YYYYMMDD
        ,CONVERT(nvarchar(10), @TmpDate, 101) -- DATENAME
        ,DATEPART(yyyy, @TmpDate) -- Year
        ,DATEPART(qq, @TmpDate) -- Q
        ,'Q' + CAST(DATEPART(q, @TmpDate) AS nchar(1)) + '-' + RIGHT(CAST(DATEPART (yy, @TmpDate) AS nchar(4)), 2) -- Qtr
        ,'Quarter ' + CAST(DATEPART(q, @TmpDate) as nchar(1)) -- Quarter
        ,'Q' + CAST(DATEPART(q, @TmpDate) AS nchar(1)) + 'CY' + RIGHT(CAST(DATEPART(yy, @TmpDate) AS nvarchar(4)), 2) -- QuarterName
        ,DATEPART(mm, @TmpDate) -- MM
        ,LEFT(DATENAME(mm, @TmpDate), 3) -- Mon
        ,DATENAME(mm, @TmpDate) -- Month
        ,DATENAME(mm, @TmpDate) + ' ' + CAST(DATEPART(yy, @TmpDate) AS nvarchar(4)) -- MonthName
        ,DATEPART(dd, @TmpDate) -- DD
        ,LEFT(DATENAME(dw, @TmpDate), 3) -- Dy
        ,DATENAME(dw, @TmpDate) -- Day
        ,DATEPART(dw, @TmpDate) -- DayOfWeek
        ,DATEPART(dy, @TmpDate) -- Julian
        ,CONVERT(int, CAST(YEAR(DATEADD(d, (DATEPART(dw, @TmpDate) - 1) * (-1), CONVERT(nvarchar(10), @TmpDate, 101))) AS nchar(4))
            + CASE
                WHEN LEN(MONTH(DATEADD(d, (DATEPART(dw, @TmpDate) - 1) * (-1), CONVERT(nvarchar(10), @TmpDate, 101)))) = 1 THEN '0' + CAST(MONTH(DATEADD(d, (DATEPART(dw, @TmpDate) - 1) * (-1), CONVERT(nvarchar(10), @TmpDate, 101))) AS nchar(1))
                ELSE CAST(MONTH(DATEADD(d, (DATEPART(dw, @TmpDate) - 1) * (-1), CONVERT(nvarchar(10), @TmpDate, 101))) AS nchar(2))
                END
            + CASE
                WHEN LEN(DAY(DATEADD(d, (DATEPART(dw, @TmpDate) - 1) * (-1), CONVERT(nvarchar(10), @TmpDate, 101)))) = 1 THEN '0' + CAST(DAY(DATEADD(d, (DATEPART(dw, @TmpDate) - 1) * (-1), CONVERT(nvarchar(10), @TmpDate, 101))) AS nchar(1))
                ELSE CAST(DAY(DATEADD(d, (DATEPART(dw, @TmpDate) - 1) * (-1), CONVERT(nvarchar(10), @TmpDate, 101))) AS nchar(2))
                END) -- WeekKey
        ,DATEPART(wk, @TmpDate) -- Week
        ,CAST((CONVERT(nchar(10), (DATEADD(d, (DATEPART(dw, @TmpDate) - 1) * (-1), CONVERT(nvarchar(10), @TmpDate, 101))), 101) + ' - '
            +CONVERT(nchar(10), (DATEADD(d, (7 - DATEPART(dw, @TmpDate) ), CONVERT(nvarchar(10), @TmpDate, 101))), 101)) AS nvarchar(25)) -- WeekName
        ,CASE                              
            WHEN DATEPART(dw, @TmpDate) in (6, 7) THEN 1
            ELSE 0
            END -- Weekend
        ,@NumYears - (DATEPART(yyyy, @TmpDate) - @StartYear) -- YearKey
        ,DATEPART(yyyy, @TmpDate) * 100 + DATEPART(mm, @TmpDate) -- MoKey
        ,LEFT(DATENAME(mm, @TmpDate),3) + '-' + RIGHT(CAST(DATEPART(yy, @TmpDate) AS nchar(4)), 2) -- MMMYY
        ,LEFT(DATENAME(mm, @TmpDate),3) + '-' + CAST(DATEPART(dd, @TmpDate) AS nchar(2)) -- MMMDD
        ,CASE                                                      
            WHEN DATEDIFF(m, @TmpDate, @EndDate) > 25 THEN 0
            ELSE 1
            END -- DayActive
        ,0 -- HolidayFlag (not specified)
        ,@LastModDate -- DTM
    )

    SET @TmpDate = DATEADD(dd, 1, @TmpDate)
END  

SET QUOTED_IDENTIFIER OFF

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值