DimDate
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的更多相关文章
- DimDate populate data
日期维度 任何一个数据仓库都应该有一个日期维度. 因为很少有不需要通过日期维度看数据的情况存在. 日期维度的好处是,你可以通过他连接各个事实表,然后在报表端传送报表参数的时候, 直接自动过滤日期维度的 ...
- SQL Server - 把星期一(周一)当作每个星期的开始在一年中求取周数
先感叹一句!好长时间没有更新博客了!偶尔看到一句话,觉得被电击了 - 庸人败于懒,能人败于傲! 因此,不能再懒惰了! 今天想写一个有关计算 Week Number 的函数,刚开始觉得应该很简单,凭着感 ...
- 向SqlServer数据库插入数据
Insert Values Insert Select Insert Exec Select Into Bulk Insert Insert Values是最常用的一种插入数据的方式,基本语法如下,表 ...
- 《BI项目笔记》创建时间维度(1)
SSAS Date 维度基本上在所有的 Cube 设计过程中都存在,很难见到没有时间维度的 OLAP 数据库.但是根据不同的项目需求, Date 维度的设计可能不大相同,所以在设计时间维度的时候需要搞 ...
- 《BI项目笔记》创建时间维度(2)
创建步骤: 序号 选择的属性 重命名后的名称 属性类别 1 DateKey DateKey 常规 2 Month Key Month Key 月份 3 English Month Name Eng ...
- BI之SSAS完整实战教程3 -- 创建第一个多维数据集
上一篇我们已经完成了数据源的准备工作,现在我们就开始动手,创建第一个多维数据集(Cube). 文章提纲 使用多维数据集向导创建多维数据集 总结Cube设计器简介 维度细化 总结 一.使用向导创建多维数 ...
- MSBI--enlarge the DW database table volume
我们在学习MSBI的时候,经常会使用官方提供的Adventureworks和AdventureworksDW示例数据库,但是官方提供的数据量有点小, 以DW为例,Factinternetsales只有 ...
- SSIS 学习(3):数据流任务(下)【转】
前一篇文章SSIS 学习(2):数据流任务(上), 介绍了如何创建一个简单的ETL包,如何通过一个简单的数据流任务,将一个文本文件的数据导入到数据库中去.这些数据都保持了它原有的本色,一个字符不 多, ...
- 数据cube的schema与sql的对应的关系
用schema workbench 设置cube的维度结构 saiku 使用的cube,会将不同维度的查询转化为sql语句. schema中, cube的事实表和dimension表进行自然连接,具体 ...
随机推荐
- mrtg
centos6.5-64-minimal http://oss.oetiker.ch/mrtg/doc/cfgmaker.en.htmlhttp://www.cnblogs.com/see7di/ar ...
- HTML5鼠标hover的时候图片放大的效果展示
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- AMD规范基本结构
AMD规范:使用 define 和 require ,基本结构如下: // 定义模块 define(['moduleA', 'moduleB', 'moduleC'], function (modul ...
- javascript模块化编程(AMD规范的加载器)
关于AMD规范可以参考阮一峰的这篇文章Javascript模块化编程(二):AMD规范 简单来说,AMD规范就是异步方式加载模块的一种方式,避免因为模块加载过慢而导致浏览器“假死”. 先贴一个学习地址 ...
- 无状态Web应用集成——《跟我学Shiro》
http://www.tuicool.com/articles/iu2qEf 在一些环境中,可能需要把Web应用做成无状态的,即服务器端无状态,就是说服务器端不会存储像会话这种东西,而是每次请求时带上 ...
- Reporting Service 报表报 rsReportServerDatabaseError 错的解决方法
一.打开CRM的报表出现“报表服务器数据库内出错.此错误可能是因连接失败.超时或数据库中磁盘空间不足而导致的. (rsReportServerDatabaseError) 获取联机帮助 对象名 'Re ...
- C#接口作用的深入理解
1.C#接口的作用 C#接口是一个让很多初学C#者容易迷糊的东西,用起来好像很简单,定义接口,里面包含方法,但没有方法具体实现的代码,然后在继承该接口的类里面要实现接口的所有方法的代码,但没有真正认识 ...
- MySQL【Update误操作】回滚(转)
前言: 继上一篇MySQL[Delete误操作]回滚之后,现在介绍下Update回滚,操作数据库时候难免会因为“大意”而误操作,需要快速恢复的话通过备份来恢复是不太可能的,因为需要还原和bi ...
- Java 权限修饰符
Java应用有很多类,但有些类并不希望被其他类使用.每个类中都有数据成员和方法成员,但是并不是每个数据和方法,都允许在其他类中调用.如何能做到访问控制呢?就需要使用访问权限修饰符. Java语言中的访 ...
- Spark(四): Spark-sql 读hbase
SparkSQL是指整合了Hive的spark-sql cli, 本质上就是通过Hive访问HBase表,具体就是通过hive-hbase-handler, 具体配置参见:Hive(五):hive与h ...