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表进行自然连接,具体 ...
随机推荐
- jspm 是浏览器包管理工具
jspm 是浏览器包管理工具. jspm 是 SystemJS 通用模块加载器的包管理器,基于动态 ES6 模块加载器 直接从任意的 registry(比如 npm 或者 GitHub)加载任意模块格 ...
- Js数组去重复取唯一值
function isBigEnough(element) { return element >= 10; } var filtered = [12, 5, 8, 130, 44].filter ...
- HDP2.4安装(二):Centos7配置
Centos7 Minimal Install 安装完成后是不支持上网的,并且大部分常用的软件也未安装,首先要解决的问题就是网络配置.当网络配通后,即可通过Xshell或其它工具来远程进行操作与管理, ...
- Android 文件的选择
Android 文件的选择 打开文件选择器 private void showFileChooser() { Intent intent = new Intent(Intent.ACTION_GET_ ...
- [转]Python中urllib与urllib2的区别与联系
引用文章1:http://my.oschina.net/u/558071/blog/144792 引用文章2:http://zhuoqiang.me/python-urllib2-usage.html ...
- Math.Round函數
Math.Round這個函數的解釋是將值按指定的小數位數舍入,但並不就是四捨五入.這種舍入有時稱為就近舍入或四舍六入五成雙 其實在 VB, VBScript, C#, J#, T-SQL 中 Roun ...
- 使用 Windows PowerShell 来管理和开发 windowsazure.cn 账户的特别注意事项
6月6日,微软面向中国大陆用户开放了Microsoft Azure公众预览版的申请界面.大家可以申请免费的 beta 试用,收到内附邀请码的通知邮件后只需输入激活码即可开始免费试用.具体网址为: ht ...
- Nginx做反向代理总是被系统kill
公司使用Nginx做反向代理,以前都挺正常的,最近不知怎么回事总是无端被系统kill,而在nginx错误日志中也没有信息输出. 网上查了很多资料,也没什么靠谱的回答,唯一觉得有点关联的就是linux ...
- UDP socket 设置为的非阻塞模式
UDP socket 设置为的非阻塞模式 Len = recvfrom(SocketFD, szRecvBuf, sizeof(szRecvBuf), MSG_DONTWAIT, (struct so ...
- RDA 编译器的搭建
apt-get install subversion apt-get install make atp-get install gcc sudo vim /etc/profile export PAT ...