0

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

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

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

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

4

3 回答 3

4

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

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

如果您仍处于事实表的设计阶段,我建议您在维度上的 PK 教程中使用日期而不是 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
于 2013-03-09T01:04:19.140 回答
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)
于 2013-03-08T23:45:45.523 回答
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
于 2013-03-09T07:57:54.467 回答