将完整日期拆分为日/月/季/年列

时间:2013-03-08 23:31:20

标签: sql sql-server sql-server-2008 data-warehouse

我有一个简单的表格结构,我的DATE列格式为yyyy-mm-dd。我想将所有日期和INSERT分成我的时间维度表,其中包含daymonthquarteryear列。我不确定如何使用它(尝试将查询作为插入)。

示例SPLIT 2010-03-01 AND INSERT 2010year列,03month列,01day列和1quarter列。

此外,我想将名称分配给特定的日期部分(例如month_name的{​​{1}}是1月),将日期名称值存储在同一个表中是不是很好?

编辑:我刚刚意识到我可能犯了大错? 1中的TIME维度是否应该仅存储唯一数据(出于说明目的?)

3 个答案:

答案 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