Таблица календаря для хранилища данных

Для моего хранилища данных я создаю таблицу календаря следующим образом:

SET NOCOUNT ON

DROP Table dbo.Calendar
GO
Create Table dbo.Calendar
(
    CalendarId              Integer NOT NULL,
    DateValue               Date    NOT NULL,
    DayNumberOfWeek         Integer NOT NULL,
    NameOfDay               VarChar (10) NOT NULL,
    NameOfMonth             VarChar (10) NOT NULL,
    WeekOfYear              Integer NOT NULL,
    JulianDay               Integer NOT NULL,
    USAIsBankHoliday        Bit     NOT NULL,
    USADayName              VarChar (100) NULL,
)
ALTER TABLE dbo.Calendar ADD CONSTRAINT
    DF_Calendar_USAIsBankHoliday DEFAULT 0 FOR USAIsBankHoliday
GO
ALTER TABLE dbo.Calendar ADD CONSTRAINT
    DF_Calendar_USADayName DEFAULT '' FOR USADayName
GO

Declare @StartDate  DateTime = '01/01/2000'
Declare @EndDate    DateTime = '01/01/2020'

While @StartDate < @EndDate
Begin
    INSERT INTO dbo.Calendar 
    (
        CalendarId, 
        DateValue, 
        WeekOfYear,
        DayNumberOfWeek,
        NameOfDay,
        NameOfMonth,
        JulianDay
    )
    Values 
    (
        YEAR (@StartDate) * 10000 + MONTH (@StartDate) * 100 + Day (@StartDate), --CalendarId
        @StartDate,                 -- DateValue
        DATEPART (ww, @StartDate),  -- WeekOfYear
        DATEPART (dw, @StartDate),  -- DayNumberOfWeek
        DATENAME (dw, @StartDate),  -- NameOfDay
        DATENAME (M, @StartDate),   -- NameOfMonth
        DATEPART (dy, @StartDate)   -- JulianDay
    )

    Set @StartDate += 1
End

--=========================== Weekends
-- saturday and sunday
UPDATE dbo.Calendar SET USAIsBankHoliday = 1, USADayName += 'Weekend, ' WHERE DayNumberOfWeek IN (1, 7) 


--=========================== Bank Holidays
-- new years day
UPDATE dbo.Calendar SET USAIsBankHoliday = 1, USADayName += 'New Year' Day, '  WHERE (CalendarId % 2000) IN (101)

-- memorial day (last Monday in May)
UPDATE dbo.Calendar 
SET USAIsBankHoliday = 1, 
    USADayName += 'Memorial Day, '  
WHERE 1=1
AND CalendarId IN 
    (
        SELECT MAX (CalendarId)
        FROM dbo.Calendar 
        WHERE MONTH (DateValue) = 5 
        AND DATEPART (DW, DateValue)=2
        GROUP BY YEAR (datevalue)
    )

-- independence day
UPDATE dbo.Calendar SET USAIsBankHoliday = 1, USADayName += 'Independence Day, '  WHERE (CalendarId % 2000) IN (704)

-- labor day (first Monday in September)
UPDATE dbo.Calendar 
SET USAIsBankHoliday = 1, 
    USADayName += 'Labor Day, '  
WHERE 1=1
AND CalendarId IN 
    (
        SELECT MIN (CalendarId)
        FROM dbo.Calendar 
        WHERE MONTH (DateValue) = 9
        AND DATEPART (DW, DateValue)=2
        GROUP BY YEAR (datevalue)
    )

-- thanksgiving day (fourth Thursday in November)
UPDATE dbo.Calendar 
SET USAIsBankHoliday = 1, 
    USADayName += 'Thanksgiving Day, '  
WHERE 1=1
AND CalendarId IN 
    (
        SELECT Max (CalendarId)-2
        FROM dbo.Calendar 
        WHERE MONTH (DateValue) = 11
        AND DATEPART (DW, DateValue)=7
        GROUP BY YEAR (datevalue)
    )

-- christmas
UPDATE dbo.Calendar SET USAIsBankHoliday = 1, USADayName += 'Christmas Day, '  WHERE (CalendarId % 2000) IN (1225)

--=========================== Other named days
-- new years eve
UPDATE dbo.Calendar SET USADayName += 'New Year' Eve, '  WHERE (CalendarId % 2000) IN (1231)

-- black friday (day after thanksgiving day)
UPDATE dbo.Calendar SET USADayName += 'Black Friday, '  WHERE CalendarId IN (SELECT CalendarId+1 From dbo.Calendar Where USADayName like '%Thanksgiving%')

-- christmas eve
UPDATE dbo.Calendar SET USADayName += 'Christmas Eve, '  WHERE (CalendarId % 2000) IN (1224)

-- boxing day
UPDATE dbo.Calendar SET USADayName += 'Boxing Day, '  WHERE (CalendarId % 2000) IN (1226)

--=========================== Remove trailing comma
UPDATE dbo.Calendar SET USADayName = SubString (USADayName, 1, LEN (USADayName) -1) WHERE LEN (USADayName) > 2

SELECT * FROM dbo.Calendar




Вот вывод этой команды

http://img35.imageshack.us/img35/3899/calendartable.png

Я видел аналогичные структуры, реализованные в разных вариантах архитекторами данных.

Мой вопрос: какую дополнительную информацию о хранилище данных/размерном стиле можно добавить в эту структуру таблицы?

Ответ 1

  • Четверть
  • Год
  • Финансовый/отчетный год
  • Финансовый/Бухгалтерский квартал
  • isWeekend
  • isWeekday
  • isWorkDay
  • WeekId (недели с начала года)
  • isLastDayofMonth
  • DaysSince (например, дни с 01.01.2000)

Ответ 2

Это мой список возможных столбцов в календарном измерении:

  • Key
  • Дата
  • Вчера
  • Сегодня
  • Завтра
  • День года
  • День Halfyear
  • День квартала
  • День месяца
  • День недели
  • Краткое название дня недели
  • День недели Краткое название CS
  • Длительное имя дня недели
  • День недели Длительное название CS
  • Дни недели
  • Дни в месяц
  • Дни в квартале
  • Дни в Halfyear
  • Дни в году
  • Обратный день недели
  • Возвращение в День Месяца.
  • Обратный день квартала
  • Обратный день Halfyear
  • Обратный день года
  • Последние 7 дней
  • Последние 14 дней
  • Последние 30 дней
  • Последние 90 дней
  • Последние 180 дней
  • Последний 365 дней
  • День недели
  • Выходные
  • Рабочий день недели
  • Рабочий месяц месяца
  • Рабочий день квартала
  • Рабочий день Halfyear
  • Рабочий день года
  • Обратный рабочий день недели
  • Обратный рабочий месяц месяца
  • Обратный рабочий день квартала
  • Обратный рабочий день Halfyear
  • Обратный рабочий день года
  • Рабочие дни в неделю
  • Рабочие дни в месяц
  • Рабочие дни в квартале
  • Рабочие дни в Halfyear
  • Рабочие дни в году
  • Последний рабочий день в неделю
  • Последний рабочий день в месяц
  • Рабочий день
  • Праздник
  • Будущее
  • Прошлое
  • Предыдущий месяц
  • Текущий месяц
  • Следующий месяц
  • Является месяцем
  • Начало месяца.
  • Конец месяца
  • Прошлый месяц
  • Начало месяца
  • Конец месяца
  • Номер месяца
  • Название месяца Long
  • Название месяца Long CS
  • Название месяца Short
  • Название месяца Short CS
  • Месяц квартала
  • Месяц Halfyear
  • Предыдущая неделя
  • Текущая неделя
  • Следующая неделя
  • Неделя Дата
  • Начало недели
  • Конец недели
  • Прошла неделя.
  • Начало недели
  • Конец недели
  • Номер недели
  • Название недели Long
  • Название недели Short
  • Неделя месяца
  • Предыдущий квартал
  • Текущий квартал
  • Следующий квартал
  • Текущее время
  • Начало квартала
  • Конец квартала
  • Прошлый квартал
  • Начало квартала
  • Конец квартала
  • Квартальный номер
  • Название квартала Long
  • Название квартала Long CS
  • Краткое название квартала
  • Предыдущий Halfyear
  • Текущее Halfyear
  • Следующее Halfyear
  • Ожидается ли Halfyear
  • Начало Halfyear
  • Конец Halfyear
  • Прошлое Halfyear
  • Начало Halfyear
  • Конец Halfyear
  • Halfyear Number
  • Halfyear Name Long
  • Halfyear Name Long CS
  • Halfyear Name Short
  • Предыдущий год
  • Текущий год
  • Следующий год
  • Год от времени
  • Начало года.
  • Конец года
  • Прошлый год
  • Начало года
  • Конец года
  • Номер года
  • Год Название Long
  • Год Название Короткая
  • Текст квартала за год
  • Год Месяц День
  • Год Halfyear
  • Квартал года
  • Год Месяц
  • Год года
  • Год високосного года
  • Расстояние в дни от Сегодня
  • Расстояние в рабочие дни с сегодняшнего дня
  • Расстояние в календарных неделях с сегодняшнего дня
  • Расстояние в календаре Месяцев с сегодняшнего дня
  • Расстояние в календарных кварталах от Сегодня
  • Расстояние в календаре Halfyears от Сегодня
  • Расстояние в календаре Годы с сегодняшнего дня
  • N-й день недели в месяц
  • Обратный N-й день недели в месяц

Я создал интерактивную таблицу , где вы можете создать собственное измерение времени для базы данных PostgreSQL.

Ответ 3

Well Raj More, Хорошая почта и очень полезная script для создания календаря, Другие поля, которые вы можете включить в одну и ту же таблицу, 1) QuaterheYear 2) Неизвестный исполнитель 3) IsWeekday

Ответ 4

квартал года
year_quarter (2013-3)
месяц года
year_month (2013-08)
неделя года
неделя месяца
день года
день четверти
день месяца
день недели