2013-03-08 5 views
0

У меня есть простая структура таблицы, где мой столбец 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 - январь), является ли хорошей практикой хранить значения имени даты внутри той же таблицы?

Редактировать: Я только что понял, что, вероятно, совершил большую ошибку? Is TIME размер в DATA WAREHOUSE должен хранить уникальные данные только для описания?

+0

пожалуйста, объясните больше. вы хотите, чтобы предложение select разделило столбец даты в день, месяц, квартал и т. д.? – DevelopmentIsMyPassion

+0

Я бы сказал, оставить дату в качестве поля даты и по выбранным запросам, вы можете фильтровать день, месяц и год, используя функции даты. Поиск функций даты сервера sql. – Kaf

ответ

4

Обычно измерение времени означает время (часы, минуты, секунды) или дату и время.

Похоже, вам просто нужно измерение даты. Большая часть работы уже проделана для вас здесь: http://smehrozalam.wordpress.com/2009/06/09/t-sql-using-common-table-expressions-cte-to-generate-sequences/

Если вы все еще находитесь в фазе проектирования таблицы фактов, я бы рекомендовал использовать дату, а не формат YYYYMMDD в учебнике для вашего ПК на измерение. Это байт дешевле в строке и позволяет математику даты. До SQL 2008 формат ввода даты был определен. Теперь эта дата доступна, это более подходящий выбор.

Что касается уникальности, то для иерархии и связанных отношений атрибутов в 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