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
, [WeekFirstDay] DATE
, [WeekEndDay] DATE
, 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],
[WeekFirstDay],
[WeekEndDay]
)
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,
DATEADD(wk, DATEDIFF(wk,0,d.FullDate), 0) AS WeekFirstDay,
DATEADD(wk, DATEDIFF(wk,0,d.FullDate), 6) AS WeekEndDay
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
 
SELECT * FROM [DimDate]
EXEC PopulateDimDate '2005-01-01','2026-12-31',-4
DROP TABLE [DimDate]

DimDate的更多相关文章

  1. DimDate populate data

    日期维度 任何一个数据仓库都应该有一个日期维度. 因为很少有不需要通过日期维度看数据的情况存在. 日期维度的好处是,你可以通过他连接各个事实表,然后在报表端传送报表参数的时候, 直接自动过滤日期维度的 ...

  2. SQL Server - 把星期一(周一)当作每个星期的开始在一年中求取周数

    先感叹一句!好长时间没有更新博客了!偶尔看到一句话,觉得被电击了 - 庸人败于懒,能人败于傲! 因此,不能再懒惰了! 今天想写一个有关计算 Week Number 的函数,刚开始觉得应该很简单,凭着感 ...

  3. 向SqlServer数据库插入数据

    Insert Values Insert Select Insert Exec Select Into Bulk Insert Insert Values是最常用的一种插入数据的方式,基本语法如下,表 ...

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

    SSAS Date 维度基本上在所有的 Cube 设计过程中都存在,很难见到没有时间维度的 OLAP 数据库.但是根据不同的项目需求, Date 维度的设计可能不大相同,所以在设计时间维度的时候需要搞 ...

  5. 《BI项目笔记》创建时间维度(2)

    创建步骤:   序号 选择的属性 重命名后的名称 属性类别 1 DateKey DateKey 常规 2 Month Key Month Key 月份 3 English Month Name Eng ...

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

    上一篇我们已经完成了数据源的准备工作,现在我们就开始动手,创建第一个多维数据集(Cube). 文章提纲 使用多维数据集向导创建多维数据集 总结Cube设计器简介 维度细化 总结 一.使用向导创建多维数 ...

  7. MSBI--enlarge the DW database table volume

    我们在学习MSBI的时候,经常会使用官方提供的Adventureworks和AdventureworksDW示例数据库,但是官方提供的数据量有点小, 以DW为例,Factinternetsales只有 ...

  8. SSIS 学习(3):数据流任务(下)【转】

    前一篇文章SSIS 学习(2):数据流任务(上), 介绍了如何创建一个简单的ETL包,如何通过一个简单的数据流任务,将一个文本文件的数据导入到数据库中去.这些数据都保持了它原有的本色,一个字符不 多, ...

  9. 数据cube的schema与sql的对应的关系

    用schema workbench 设置cube的维度结构 saiku 使用的cube,会将不同维度的查询转化为sql语句. schema中, cube的事实表和dimension表进行自然连接,具体 ...

随机推荐

  1. mrtg

    centos6.5-64-minimal http://oss.oetiker.ch/mrtg/doc/cfgmaker.en.htmlhttp://www.cnblogs.com/see7di/ar ...

  2. HTML5鼠标hover的时候图片放大的效果展示

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  3. AMD规范基本结构

    AMD规范:使用 define 和 require ,基本结构如下: // 定义模块 define(['moduleA', 'moduleB', 'moduleC'], function (modul ...

  4. javascript模块化编程(AMD规范的加载器)

    关于AMD规范可以参考阮一峰的这篇文章Javascript模块化编程(二):AMD规范 简单来说,AMD规范就是异步方式加载模块的一种方式,避免因为模块加载过慢而导致浏览器“假死”. 先贴一个学习地址 ...

  5. 无状态Web应用集成——《跟我学Shiro》

    http://www.tuicool.com/articles/iu2qEf 在一些环境中,可能需要把Web应用做成无状态的,即服务器端无状态,就是说服务器端不会存储像会话这种东西,而是每次请求时带上 ...

  6. Reporting Service 报表报 rsReportServerDatabaseError 错的解决方法

    一.打开CRM的报表出现“报表服务器数据库内出错.此错误可能是因连接失败.超时或数据库中磁盘空间不足而导致的. (rsReportServerDatabaseError) 获取联机帮助 对象名 'Re ...

  7. C#接口作用的深入理解

    1.C#接口的作用 C#接口是一个让很多初学C#者容易迷糊的东西,用起来好像很简单,定义接口,里面包含方法,但没有方法具体实现的代码,然后在继承该接口的类里面要实现接口的所有方法的代码,但没有真正认识 ...

  8. MySQL【Update误操作】回滚(转)

    前言:      继上一篇MySQL[Delete误操作]回滚之后,现在介绍下Update回滚,操作数据库时候难免会因为“大意”而误操作,需要快速恢复的话通过备份来恢复是不太可能的,因为需要还原和bi ...

  9. Java 权限修饰符

    Java应用有很多类,但有些类并不希望被其他类使用.每个类中都有数据成员和方法成员,但是并不是每个数据和方法,都允许在其他类中调用.如何能做到访问控制呢?就需要使用访问权限修饰符. Java语言中的访 ...

  10. Spark(四): Spark-sql 读hbase

    SparkSQL是指整合了Hive的spark-sql cli, 本质上就是通过Hive访问HBase表,具体就是通过hive-hbase-handler, 具体配置参见:Hive(五):hive与h ...