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. oracle进程

    http://blog.csdn.net/leshami/article/details/5529239 Oracle实例和Oracle数据库(Oracle体系结构) 几类进程:用户进程,服务进程,后 ...

  2. Python画图形界面

    使用QTdesigner 生成.ui文件,输入命令行pyuic4 -o test.py test.ui 在生成的Python文件后面输入下面代码 if __name__=="__main__ ...

  3. dwr使用步骤

    DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码使用运行在 ...

  4. Linux 下增大tomcat内存

    我的服务器的配置: # OS specific support.  $var _must_ be set to either true or false. JAVA_OPTS="-Xms10 ...

  5. java序列化---转

    Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是 ...

  6. apache启用gzip压缩方法--转载自http://www.cnblogs.com/linzhenjie/archive/2013/03/05/2943635.html

    一.gzip介绍 Gzip是一种流行的文件压缩算法,现在的应用十分广泛,尤其是在Linux平台.当应用Gzip压缩到一个纯文本文件时,效果是非常明显的,大约可以减少70%以上的文件大小.这取决于文件中 ...

  7. php 同步因子的并发处理

    在php中,如果处理支付时,会涉及到并发. 具体体现在同步通知支付结果和异步通知结果. 拿支付宝来说,同步通知call_back和异步通知notify是没有固定先后顺序的. 有可能notify先通知到 ...

  8. js 图片切换效果

    效果如下: 代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&quo ...

  9. HackerRank "The Indian Job"

    A sly knapsack problem in disguise! Thanks to https://github.com/bhajunsingh/programming-challanges/ ...

  10. HackerRank "No Prefix Set"

    Typical Trie usage. But please note that it could be any order of input strings. #include <algori ...