0

DATE列にyyyy-mm-ddフォーマットがある単純なテーブル構造があります。すべての日付とそれらを、 、、および列INSERTを含む時間ディメンション テーブルに分割したいと考えています。これをどうやって進めるのかわかりません(クエリを挿入先として試しています)。daymonthquarteryear

:列に、SPLIT 2010-03-01 AND INSERT 2010列に、列に、列に。year03month01day1quarter

month_nameさらに、名前を特定の日付部分 (たとえば1 月)に割り当てたいのです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 形式ではなく、日付を使用することをお勧めします。行ごとに 1 バイト安くなり、日付演算が可能になります。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
-- 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 に答える
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 に答える