DimDate

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
时间: 2024-08-27 08:50:18

DimDate的相关文章

DimDate populate data

日期维度 任何一个数据仓库都应该有一个日期维度. 因为很少有不需要通过日期维度看数据的情况存在. 日期维度的好处是,你可以通过他连接各个事实表,然后在报表端传送报表参数的时候, 直接自动过滤日期维度的相关值,而不需要自己写query. 去掉了西班牙语和法语的那些列. You know that there are some holes in the sample database, DW2008R2 DIMDATE table. So I take my own dimdate. Just re

向SqlServer数据库插入数据

Insert Values Insert Select Insert Exec Select Into Bulk Insert Insert Values是最常用的一种插入数据的方式,基本语法如下,表名之后可以指定目标列的名称,这种显式的指定目标列的名称是可选的,但是这种做法的好处是对语句的列值列名之间的关联关系进行控制,而不必单纯的依赖定义表时 各个列出现的顺序 INSERT INTO dbo.DimDate ( DataKey , Year , Qu , QuCN , Month , Mon

微软BI 之SSRS 系列 - 实现 Excel 中图表结合的报表设计

来自群里面讨论的一个问题,EXCEL 中有类似于这样的图形,上面是 Chart, Chart X轴上的值正好就是下方 Table 的列头,这个在 SSRS 中应该如何实现? SSRS 2008.2008RS,2012 中实际上没有这种对应的控件,我们通常想到的方式可能是上方一个单独的 Chart 图,下方一个 Table 然后合并在一起.但是这样会存在一些问题,因为 Chart 轴的值不是固定的,会随着聚合值的增加而扩展.并且对于表中的列头来说也没有办法完全能够和 Chart X 轴上的坐标对应

译--列存储索引1:初始列存储索引

2012以后提供了一种不同于传统B树结构的索引类型,就是内存列存储索引.这种索引应用了一种基于列的存储模式,也是一种新的查询执行的批处理模式,并且为特定的负载提供了巨大的性能提升.它是如何构建?如何工作?又是为什么能对性能有如此大的提升,接下来我们用简明的描述和详尽的示例来解释说明. 那么列存储索引究竟是什么?大多数时候,列存储索引被描述作为一种数据仓库和数据报表的功能.事实上,你最有可能就是在这种情况下利用这种索引.然而,即使在OLTP数据库中,你也会遇到一些要从大量数据表中获取数据的报表,它

SQL Server分区脚本备份

--生成分区脚本DECLARE @DataBaseName NVARCHAR(50)--数据库名称DECLARE @TableName NVARCHAR(50)--表名称DECLARE @ColumnName NVARCHAR(50)--字段名称DECLARE @Location NVARCHAR(50)--保存分区文件的路径DECLARE @PStartDay DATE--分区开始时间点DECLARE @PEndDay DATE --分区截止时间点DECLARE @FGStr NVARCHAR

维度属性的KeyColumns,NameColumn和ValueColumn

维度的每一个属性都有KeyColumns,NameColumn和ValueColumn 1,如何理解KeyColumns,NameColumn和ValueColumn?对一行记录有不同的标识列,但标识的是同一行记录. 对于int类型,占用存储空间小,容易聚合,适合做primary key,但是不易阅读: char类型的数据,容易阅读,适合作为Name Column: 对于一个有具体类型的数据,其value必须能够做一些运算,例如Date类型,能够做Year(),dateadd()等运算,这些可以

BI之SSAS完整实战教程3 -- 创建第一个多维数据集.docx

上一篇我们已经完成了数据源的准备工作,现在我们就开始动手,创建第一个多维数据集(Cube). 文章提纲 使用多维数据集向导创建多维数据集 总结Cube设计器简介 维度细化 总结 一.使用向导创建多维数据集 在Analysis Services中,可以通过3种方法构建多维数据集:自上而下,自下而上或者基于一个空多维数据集. 一般我们从现有的关系数据库自下而上构建. 在自下而上方式中,需要一个DSV作为多维数据集的构建基础. AS中的多维数据集(Cube)包括两部分: 1. 一个或多个度量值组,其数

多维建模(四)

启用SqlServer和AnalysisService 服务 打开VisualStudio,创建AnalysisService 多维数据挖掘项目 及 解决方案. 创建数据源:AdventureWorksDW2008R2 创建数据源视图:DimCustomer.DimDate.DimGeography.DimProduct. FactInternetSales 点击关系图中的表或者列,右键属性可更改相应的名称. 在销售表中选中SalesTerritoryKey,按住鼠标拖动到地区表中的SalesT

《BI项目笔记》创建时间维度(1)

原文:<BI项目笔记>创建时间维度(1) SSAS Date 维度基本上在所有的 Cube 设计过程中都存在,很难见到没有时间维度的 OLAP 数据库.但是根据不同的项目需求, Date 维度的设计可能不大相同,所以在设计时间维度的时候需要搞清楚几个问题: 你的业务涉及到的最低的细节级别是什么?比如按季度查看报表还是按月份,或者按周,或者再甚者按天.这个细节级别需要弄清楚,比如在一些销售数据统计,有的时候可能更多按季度或者按月来查看报表.但在有的监控一些机器运行数据的统计,可能会按照小时或者分