2013-03-08 79 views
0

我有一个简单的表结构,其中我的DATE列的格式为yyyy-mm-dd。我想将所有日期和INSERT拆分为我的时间维度表,其中包含daymonthquarteryear列。我不知道如何解决这个问题(试着用查询插入)。将日期划分为日/月/季/年列

SPLIT 2010-03-01 AND INSERT 2010year柱,03month柱,01day柱和1quarter柱。

此外,我想指定名称到特定的日期部分(例如month_name对于1是1月),是否将日期名称值存储在同一个表内?

编辑:我刚刚意识到我可能犯了很大的错误?是TIME尺寸在DATA WAREHOUSE应该只存储唯一的数据(用于描述的目的?)

+0

请解释更多。你想要select子句在日,月,季度等分割你的日期列吗? – DevelopmentIsMyPassion 2013-03-08 23:35:13

+0

我会说离开日期作为日期字段和选择查询,您可以使用日期函数过滤日,月和年。搜索sql服务器日期函数。 – Kaf 2013-03-08 23:36:49

回答

4
通常

时间维度意味着时间(小时,分,秒)或日期时间。

这听起来像你只需要一个日期维度。大部分工作已经在这里为您完成了:http://smehrozalam.wordpress.com/2009/06/09/t-sql-using-common-table-expressions-cte-to-generate-sequences/

如果您仍处于事实表的设计阶段,我建议您在本教程中使用日期而不是YYYYMMDD ID格式尺寸。这是每行更便宜的一个字节,并启用日期数学。在SQL 2008之前,int dateid格式有意义。现在该日期已经可用,这是一个更合适的选择。

至于唯一性,对于ssas中的层次结构和关联的属性关系,我通常会组合必要的列来唯一标识期间。例如:

SELECT 
    CAST(YEAR(GETDATE()) as char(4)) + ' ' + DATENAME(MONTH,GETDATE()) MonthUniqueName 
, CAST(YEAR(GETDATE()) as char(4)) + ' Q' + CAST(DATEPART(QUARTER,GETDATE()) as char(1)) QuarterUniqueName 

回报

MonthUniqueName  QuarterUniqueName 
2013 March   2013 Q1 
0

这是你想要的吗?

select Datename(yy,yourDateColumn) as year, Datename(quarter,yourDateColumn), Datename(month, yourDateColumn),Datename(day, yourDatecolumn),CONVERT(varchar(3), yourDateColumn, 100) from yourTable 

假设你有柱类型的DateTime

Insert into yourTable (yearColumn, quarterColumn, monthColumn, dayColumn) values 
Datename(yy,yourDateColumn) , Datename(quarter,yourDateColumn), Datename(month, yourDateColumn),Datename(day, yourDatecolumn) 
0
-- First solution: date is stored and day, month, year and quarter are computed 
DECLARE @Table1 TABLE (
    Dt DATE NOT NULL, 
    DD AS CONVERT(TINYINT, DATEPART(DAY, Dt)) PERSISTED, 
    MM AS CONVERT(TINYINT, DATEPART(MONTH, Dt)) PERSISTED, 
    YYYY AS CONVERT(SMALLINT, DATEPART(YEAR, Dt)) PERSISTED, 
    QQ AS CONVERT(TINYINT, DATEPART(QUARTER, Dt)) PERSISTED 
); 
INSERT @Table1 
VALUES (GETDATE()); 

SELECT * FROM @Table1; 

-- Second solution: day, month and year are stored and date and quarter are stored 
DECLARE @Table2 TABLE (
    Dt AS CONVERT(DATE, DATEADD(DAY, DD-1, DATEADD(MONTH, MM-1, DATEADD(YEAR, YYYY-1, CONVERT(DATE, '00010101',112))))) PERSISTED, 
    DD TINYINT NOT NULL CHECK(DD BETWEEN 1 AND 31), 
    MM TINYINT NOT NULL CHECK(MM BETWEEN 1 AND 12), 
    YYYY SMALLINT NOT NULL CHECK(YYYY BETWEEN 1 AND 9999), 
    QQ AS CONVERT(TINYINT, ((MM-1)/3)+1) PERSISTED 
); 
INSERT @Table2 (DD, MM, YYYY) 
VALUES (9,3,2013); 

SELECT * FROM @Table2; 

结果:

Dt   DD MM YYYY QQ 
---------- ---- ---- ------ ---- 
2013-03-09 9 3 2013 1 

Dt   DD MM YYYY QQ 
---------- ---- ---- ------ ---- 
2013-03-09 9 3 2013 1 
相关问题