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表进行自然连接,具体 ...
随机推荐
- Oracle数据库—— 事务处理与并发控制
一.涉及内容 1.理解事务的概念和几个特性. 2.熟练掌握事务管理命令的使用. 3.理解并发操作的概念和数据库锁的类型. 二.具体操作 (12.5 实验) 1. 分析以下代码,说出代码中的哪些部分体现 ...
- linux包之coreutils之du和df命令
[root@localhost ~]# rpm -qf /usr/bin/ducoreutils-8.4-31.el6.x86_64[root@localhost ~]# rpm -qf /bin/d ...
- es6新特性
变量-------------------------- let, const:必须直接给一个变量赋值.注意,对象的属性或数组成员还是可以改变的. const MY_OBJECT = {some: 1 ...
- 使用maven编译dubbo,导入eclipse(其他maven开源项目编译类似)
dubbo github下载地址:https://github.com/alibaba/dubbo 相关文档:http://dubbo.io/ 使用maven编译dubbo,导入eclipse(其他m ...
- ettercap ARP dns 欺骗
1.arp 这个简单,太熟了.略过1 2.dns 根据arp欺骗的步骤. 多了个etter.dns文件 找到它:locate etter.dns 进入后添加dns正向解析 启动,选 ...
- 8张图带你深入理解Java
1.字符串的不变性 下图展示了如下的代码运行过程: String s = "abcd";s = s.concat("ef"); 备注:String refe ...
- 【mongodb系统学习之十二】mongodb修改数据(一)
十二.mongodb修改数据:update 1).修改数据库数据:update:语法 db.collectionName.update({},{},boolean,boolean): 2).updat ...
- Sublime text2用户自定义配置
[{ "keys": ["ctrl+d"], "command": "run_macro_file", "ar ...
- 黄聪:wordpress源码解析-目录结构-文件调用关系(转)
Wordpress是一个单入口的文件,所有的前端处理都必须经过index.php,这是通过修改web服务器的rewrite规则来实现的.这种做法的好处是显而易见的,这样URL更好看,不必为每一个url ...
- 黄聪:C#里如何使用WebBrowser获取处理AJAX生成的网页内容?
等待网页执行完毕(AJAX执行后). 使用webBrowser1.Document.Body.OuterHtml可以获取到AJAX产生的网页内容.