我有一个简单的表格结构,我的DATE
列格式为yyyy-mm-dd
。我想将所有日期和INSERT
分成我的时间维度表,其中包含day
,month
,quarter
和year
列。我不确定如何使用它(尝试将查询作为插入)。
示例:SPLIT 2010-03-01 AND INSERT 2010
到year
列,03
到month
列,01
到day
列和1
到quarter
列。
此外,我想将名称分配给特定的日期部分(例如month_name
的{{1}}是1月),将日期名称值存储在同一个表中是不是很好?
编辑:我刚刚意识到我可能犯了大错? 1
中的TIME
维度是否应该仅存储唯一数据(出于说明目的?)
答案 0 :(得分:4)
通常,时间维度表示时间(小时,分钟,秒)或日期时间。
听起来你只需要一个日期维度。大部分工作已在此处完成:http://smehrozalam.wordpress.com/2009/06/09/t-sql-using-common-table-expressions-cte-to-generate-sequences/
如果您仍然处于事实表的设计阶段,我建议您在维度中使用日期而不是YYYYMMDD ID格式的PK。它每行便宜一个字节,并启用日期数学。在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
答案 1 :(得分: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)
答案 2 :(得分: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