2013-03-08 70 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 
相關問題