码迷,mamicode.com
首页 > 其他好文 > 详细

DimDate

时间:2016-09-08 12:37:07      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

EXEC PopulateDimDate 2005-01-01,2026-12-31,-4


CREATE TABLE [dbo].[DimDate]( [DateKey] int NOT NULL
     , [FullDate] DATE NOT NULL
     , [MonthNumberOfYear] tinyint NOT NULL
     , [MonthNumberOfQuarter] tinyint NOT NULL
     , [ISOYearAndWeekNumber] char(7) NOT NULL
     , [ISOWeekNumberOfYear] tinyint NOT NULL
     , [SSWeekNumberOfYear] tinyint NOT NULL
     , [ISOWeekNumberOfQuarter_454_Pattern] tinyint NOT NULL
     , [SSWeekNumberOfQuarter_454_Pattern] tinyint NOT NULL
     , [SSWeekNumberOfMonth] tinyint NOT NULL
     , [DayNumberOfYear] smallint NOT NULL
     , [DaysSince1900] int NOT NULL
     , [DayNumberOfFiscalYear] smallint NOT NULL
     , [DayNumberOfQuarter] smallint NOT NULL
     , [DayNumberOfMonth] tinyint NOT NULL
     , [DayNumberOfWeek_Sun_Start] tinyint NOT NULL
     , [MonthName] varchar(10) NOT NULL
     , [MonthNameAbbreviation] char(3) NOT NULL
     , [DayName] varchar(10) NOT NULL
     , [DayNameAbbreviation] varchar(10) NOT NULL
     , [CalendarYear] smallint NOT NULL
     , [CalendarYearMonth] char(7) NOT NULL
     , [CalendarYearQtr] char(7) NOT NULL
     , [CalendarSemester] tinyint NOT NULL
     , [CalendarQuarter] tinyint NOT NULL
     , [FiscalYear] smallint NOT NULL
     , [FiscalMonth] tinyint NOT NULL
     , [FiscalQuarter] tinyint NOT NULL
     , [FiscalYearMonth] char(7) NOT NULL
     , [FiscalYearQtr] char(8) NOT NULL
     , [QuarterNumber] int NOT NULL
     , [YYYYMMDD] char(8) NOT NULL
     , [MM/DD/YYYY] char(10) NOT NULL
     , [YYYY/MM/DD] char(10) NOT NULL
     , [YYYY-MM-DD] char(10) NOT NULL
     , [MonDDYYYY] char(11) NOT NULL
     , [IsLastDayOfMonth] char(1) NOT NULL
     , [IsWeekday] char(1) NOT NULL
     , [IsWeekend] char(1) NOT NULL
     , [IsWorkday] char(1) NOT NULL DEFAULT N
     , [IsFederalHoliday] char(1) NOT NULL DEFAULT N
     , [IsBankHoliday] char(1) NOT NULL DEFAULT N
     , [IsCompanyHoliday] char(1) NOT NULL DEFAULT N
     , [PeriodYearMonth] NVARCHAR(12) NOT NULL
     , CONSTRAINT [PK_DimDate_DateKey] PRIMARY KEY CLUSTERED ([DateKey] ASC)
     )
GO








CREATE PROCEDURE dbo.PopulateDimDate
    @starting_dt DATE ,
    @ending_dt DATE ,
    @FiscalYearMonthsOffset INT
AS
    SET NOCOUNT ON
    SET DATEFIRST 7     -- Standard for U.S. Week starts on Sunday

    DECLARE @Yr INT ,
        @EndYr INT
    SET @Yr = DATEPART(yyyy, @starting_dt)
    SET @EndYr = DATEPART(yyyy, @ending_dt)


    DECLARE @StartYear AS INT = YEAR(@starting_dt);
    DECLARE @EndYear AS INT = YEAR(@ending_dt);
    WITH    cteYears
              AS ( SELECT   YYYY = @StartYear
                   UNION ALL
                   SELECT   YYYY + 1
                   FROM     cteYears
                   WHERE    YYYY < @EndYear
                 ),
            cteMonths
              AS ( SELECT   MM = 1
                   UNION ALL
                   SELECT   MM + 1
                   FROM     cteMonths
                   WHERE    MM < 12
                 ),
            cteDays
              AS ( SELECT   DD = 1
                   UNION ALL
                   SELECT   DD + 1
                   FROM     cteDays
                   WHERE    DD < 31
                 ),
            cteDatesRaw
              AS ( SELECT   YYYY = YYYY ,
                            MM = MM ,
                            DD = DD ,
                            DateKey = YYYY * 10000 + MM * 100 + DD ,
                            FullDate = CAST(CAST(YYYY * 10000 + MM * 100 + DD AS CHAR(8)) AS DATE)
                   FROM     cteYears
                            CROSS JOIN cteMonths
                            CROSS JOIN cteDays
                   WHERE    ISDATE(YYYY * 10000 + MM * 100 + DD) = 1
                 )
        INSERT  INTO [DimDate]
                ( [DateKey] ,
                  [FullDate] ,
                  [MonthNumberOfYear] ,
                  [MonthNumberOfQuarter] ,
                  [ISOYearAndWeekNumber] ,
                  [ISOWeekNumberOfYear] ,
                  [SSWeekNumberOfYear] ,
                  [ISOWeekNumberOfQuarter_454_Pattern] ,
                  [SSWeekNumberOfQuarter_454_Pattern] ,
                  [SSWeekNumberOfMonth] ,
                  [DayNumberOfYear] ,
                  [DaysSince1900] ,
                  [DayNumberOfFiscalYear] ,
                  [DayNumberOfQuarter] ,
                  [DayNumberOfMonth] ,
                  [DayNumberOfWeek_Sun_Start] ,
                  [MonthName] ,
                  [MonthNameAbbreviation] ,
                  [DayName] ,
                  [DayNameAbbreviation] ,
                  [CalendarYear] ,
                  [CalendarYearMonth] ,
                  [CalendarYearQtr] ,
                  [CalendarSemester] ,
                  [CalendarQuarter] ,
                  [FiscalYear] ,
                  [FiscalMonth] ,
                  [FiscalQuarter] ,
                  [FiscalYearMonth] ,
                  [FiscalYearQtr] ,
                  [QuarterNumber] ,
                  [YYYYMMDD] ,
                  [MM/DD/YYYY] ,
                  [YYYY/MM/DD] ,
                  [YYYY-MM-DD] ,
                  [MonDDYYYY] ,
                  [IsLastDayOfMonth] ,
                  [IsWeekday] ,
                  [IsWeekend] ,
                  [PeriodYearMonth]
                )
                SELECT  d.DateKey ,
                        d.FullDate ,
                        d.MM AS [MonthNumberOfYear] ,
                        DATEDIFF(MM,
                                 DATEADD(qq, DATEDIFF(qq, 0, d.FullDate), 0),
                                 d.FullDate) + 1 AS MonthNumberOfQuarter ,
                        CASE WHEN DATEPART(mm, d.FullDate) = 1
                                  AND DATEPART(isoww, d.FullDate) > 50
                             THEN CAST(d.YYYY - 1 AS CHAR(4)) + W
                                  + RIGHT(0
                                          + CAST(DATEPART(isoww, d.FullDate) AS VARCHAR(2)),
                                          2)
                             WHEN DATEPART(mm, d.FullDate) = 12
                                  AND DATEPART(isoww, d.FullDate) < 40
                             THEN CAST(d.YYYY + 1 AS CHAR(4)) + W
                                  + RIGHT(0
                                          + CAST(DATEPART(isoww, d.FullDate) AS VARCHAR(2)),
                                          2)
                             ELSE CAST(d.YYYY AS CHAR(4)) + W + RIGHT(0
                                                              + CAST(DATEPART(isoww,
                                                              d.FullDate) AS VARCHAR(2)),
                                                              2)
                        END AS ISOYearAndWeekNumber ,
                        DATEPART(isoww, d.FullDate) AS ISOWeekNumberOfYear ,
                        DATEPART(ww, d.FullDate) AS SSWeekNumberOfYear ,
                        CASE WHEN DATEPART(isoww, d.FullDate) < 14
                             THEN DATEPART(isoww, d.FullDate)
                             WHEN DATEPART(isoww, d.FullDate) > 13
                                  AND DATEPART(isoww, d.FullDate) < 27
                             THEN DATEPART(isoww, d.FullDate) - 13
                             WHEN DATEPART(isoww, d.FullDate) > 26
                                  AND DATEPART(isoww, d.FullDate) < 40
                             THEN DATEPART(isoww, d.FullDate) - 26
                             ELSE DATEPART(isoww, d.FullDate) - 39
                        END AS ISOWeekNumberOfQuarter_454_Pattern ,
                        CASE WHEN DATEPART(wk, d.FullDate) < 14
                             THEN DATEPART(wk, d.FullDate)
                             WHEN DATEPART(wk, d.FullDate) > 13
                                  AND DATEPART(wk, d.FullDate) < 27
                             THEN DATEPART(wk, d.FullDate) - 13
                             WHEN DATEPART(wk, d.FullDate) > 26
                                  AND DATEPART(wk, d.FullDate) < 40
                             THEN DATEPART(wk, d.FullDate) - 26
                             ELSE DATEPART(wk, d.FullDate) - 39
                        END AS SSWeekNumberOfQuarter_454_Pattern ,
                        DATEPART(wk, d.FullDate) - DATEPART(wk,
                                                            DATEADD(MM,
                                                              DATEDIFF(MM, 0,
                                                              d.FullDate), 0))
                        + 1 AS SSWeekNumberOfMonth ,
                        DATEPART(dy, d.FullDate) AS DayNumberOfYear ,
                        DATEDIFF(dd, 18991231, d.FullDate) AS DaysSince1900 ,
                        CASE
          -- 0ffset < 0 and start of fy < current year
                             WHEN YEAR(DATEADD(mm, @FiscalYearMonthsOffset,
                                               d.FullDate)) < d.YYYY
                                  AND @FiscalYearMonthsOffset < 0
                             THEN DATEPART(dy, d.FullDate) + DATEPART(dy,
                    -- Last day of previous year
                                                              CAST(CAST(YEAR(DATEADD(mm,
                                                              @FiscalYearMonthsOffset,
                                                              d.FullDate)) AS CHAR(4))
                                                              + 1231 AS DATETIME))
                                  - DATEPART(dy,
                    -- Start date of Fiscal year
                                             DATEADD(mm, 1,
                                                     CAST(CAST(CAST(YEAR(DATEADD(mm,
                                                              @FiscalYearMonthsOffset,
                                                              d.FullDate)) AS CHAR(4))
                                                     + RIGHT(00
                                                             + CAST(@FiscalYearMonthsOffset
                                                             * -1 AS VARCHAR(2)),
                                                             2) + 01 AS CHAR(8)) AS DATETIME))
                                             - 1)
          -- 0ffset > 0 and start of fy < current year
                             WHEN YEAR(DATEADD(mm, @FiscalYearMonthsOffset,
                                               d.FullDate)) - 1 < d.YYYY
                                  AND @FiscalYearMonthsOffset > 0
                             THEN DATEPART(dy, d.FullDate) + DATEPART(dy,
                    -- Last day of previous year
                                                              CAST(CAST(YEAR(DATEADD(mm,
                                                              @FiscalYearMonthsOffset,
                                                              d.FullDate)) - 1 AS CHAR(4))
                                                              + 1231 AS DATETIME))
                                  - DATEPART(dy,
                    -- Start date of Fiscal year
                                             CAST(CAST(CAST(YEAR(DATEADD(mm,
                                                              @FiscalYearMonthsOffset,
                                                              d.FullDate)) - 1 AS CHAR(4))
                                             + RIGHT(00
                                                     + CAST(13
                                                     - @FiscalYearMonthsOffset AS VARCHAR(2)),
                                                     2) + 01 AS CHAR(8)) AS DATETIME)
                                             - 1)
          -- 0ffset < 0 and start of fy = current year
                             WHEN YEAR(DATEADD(mm, @FiscalYearMonthsOffset,
                                               d.FullDate)) = d.YYYY
                                  AND @FiscalYearMonthsOffset < 0
                             THEN DATEPART(dy, d.FullDate) - DATEPART(dy,
                    -- Start date of Fiscal year
                                                              DATEADD(mm, 1,
                                                              CAST(CAST(CAST(YEAR(DATEADD(mm,
                                                              @FiscalYearMonthsOffset,
                                                              d.FullDate)) AS CHAR(4))
                                                              + RIGHT(00
                                                              + CAST(@FiscalYearMonthsOffset
                                                              * -1 AS VARCHAR(2)),
                                                              2) + 01 AS CHAR(8)) AS DATETIME))
                                                              - 1)
          -- 0ffset > 0 and start of fy = current year
                             WHEN YEAR(DATEADD(mm, @FiscalYearMonthsOffset,
                                               d.FullDate)) - 1 = d.YYYY
                                  AND @FiscalYearMonthsOffset > 0
                             THEN DATEPART(dy, d.FullDate) - DATEPART(dy,
                    -- Start date of Fiscal year
                                                              CAST(CAST(CAST(YEAR(DATEADD(mm,
                                                              @FiscalYearMonthsOffset,
                                                              d.FullDate)) - 1 AS CHAR(4))
                                                              + RIGHT(00
                                                              + CAST(13
                                                              - @FiscalYearMonthsOffset AS VARCHAR(2)),
                                                              2) + 01 AS CHAR(8)) AS DATETIME)
                                                              - 1)
                             ELSE DATEPART(dy, d.FullDate)
                        END AS [DayNumberOfFiscalYear] ,
                        DATEDIFF(dd,
                                 DATEADD(qq, DATEDIFF(qq, 0, d.FullDate), 0),
                                 d.FullDate) + 1 AS DayNumberOfQuarter ,
                        d.DD AS DayNumberOfMonth ,
                        DATEPART(dw, d.FullDate) AS DayNumberOfWeek_Sun_Start ,
                        DATENAME(MONTH, d.FullDate) AS MonthName ,
                        LEFT(DATENAME(MONTH, d.FullDate), 3) AS MonthNameAbbreviation ,
                        DATENAME(dw, d.FullDate) AS DayName ,
                        LEFT(DATENAME(dw, d.FullDate), 3) AS DayNameAbbreviation ,
                        d.YYYY AS CalendarYear ,
                        CONVERT(VARCHAR(7), d.FullDate, 126) AS CalendarYearMonth ,
                        CAST(d.YYYY AS CHAR(4)) + - + RIGHT(0
                                                              + CAST(DATEPART(qq,
                                                              d.FullDate) AS CHAR(1)),
                                                              2) AS CalendarYearQtr ,
                        CASE d.MM
                          WHEN 1 THEN 1
                          WHEN 2 THEN 1
                          WHEN 3 THEN 1
                          WHEN 4 THEN 1
                          WHEN 5 THEN 1
                          WHEN 6 THEN 1
                          ELSE 2
                        END AS CalendarSemester ,
                        DATEPART(qq, d.FullDate) AS CalendarQuarter ,
                        DATEPART(yyyy,
                                 DATEADD(mm, @FiscalYearMonthsOffset,
                                         d.FullDate)) AS [FiscalYear] ,
                        DATEPART(mm,
                                 DATEADD(mm, @FiscalYearMonthsOffset,
                                         d.FullDate)) AS [FiscalMonth] ,
                        DATEPART(qq,
                                 DATEADD(mm, @FiscalYearMonthsOffset,
                                         d.FullDate)) AS [FiscalQuarter] ,
                        CAST(DATEPART(yyyy,
                                      DATEADD(mm, @FiscalYearMonthsOffset,
                                              d.FullDate)) AS CHAR(4)) + -
                        + RIGHT(0
                                + CAST(DATEPART(mm,
                                                DATEADD(mm,
                                                        @FiscalYearMonthsOffset,
                                                        d.FullDate)) AS VARCHAR(2)),
                                2) AS [FiscalYearMonth] ,
                        CAST(DATEPART(yyyy,
                                      DATEADD(mm, @FiscalYearMonthsOffset,
                                              d.FullDate)) AS CHAR(4)) + Q
                        + RIGHT(0
                                + CAST(DATEPART(qq,
                                                DATEADD(mm,
                                                        @FiscalYearMonthsOffset,
                                                        d.FullDate)) AS VARCHAR(2)),
                                2) AS [FiscalYearQtr] ,
                        DATEDIFF(qq, 18991231, d.FullDate) AS [QuarterNumber] ,
                        CONVERT(VARCHAR(8), d.FullDate, 112) AS [YYYYMMDD] ,
                        CONVERT(VARCHAR(10), d.FullDate, 101) AS [MM/DD/YYYY] ,
                        CONVERT(VARCHAR(10), d.FullDate, 111) AS [YYYY/MM/DD] ,
                        REPLACE(CONVERT(VARCHAR(10), d.FullDate, 111), /,
                                -) AS [YYYY-MM-DD] ,
                        LEFT(DATENAME(MONTH, d.FullDate), 3) +   + RIGHT(0
                                                              + CAST(DATEPART(dd,
                                                              d.FullDate) AS VARCHAR(2)),
                                                              2) +  
                        + CAST(d.YYYY AS CHAR(4)) AS [MonDDYYYY] ,
                        CASE WHEN d.FullDate = DATEADD(d,
                                                       -DAY(DATEADD(mm, 1,
                                                              d.FullDate)),
                                                       DATEADD(mm, 1,
                                                              d.FullDate))
                             THEN Y
                             ELSE N
                        END AS IsLastDayOfMonth ,
                        CASE DATEPART(dw, d.FullDate)
                          WHEN 1 THEN N
                          WHEN 7 THEN N
                          ELSE Y
                        END AS IsWeekday ,
                        CASE DATEPART(dw, d.FullDate)
                          WHEN 1 THEN Y
                          WHEN 7 THEN Y
                          ELSE N
                        END AS IsWeekend ,
                        CAST(d.YYYY AS CHAR(4)) +  + DATENAME(MONTH,
                                                              d.FullDate)
                        +  PeriodYearMonth
                FROM    cteDatesRaw d
                WHERE   d.DateKey BETWEEN CAST(CONVERT(CHAR(8), @starting_dt, 112) AS INT)
                                  AND     CAST(CONVERT(CHAR(8), @ending_dt, 112) AS INT)

GO

 

DimDate

标签:

原文地址:http://www.cnblogs.com/BinBinGo/p/5852513.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!