Календарь стол для хранилища данных - PullRequest
13 голосов
/ 29 июля 2009

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

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''s 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''s 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




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



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

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

Ответы [ 4 ]

10 голосов
/ 29 июля 2009
  • Четверть
  • год
  • Финансовый / Бухгалтерский год
  • Финансовый / Бухгалтерский квартал
  • isWeekend
  • isWeekday
  • isWorkDay
  • WeekId (недели с начала года)
  • isLastDayofMonth
  • DaysSince (например, дни с 01.01.2000)
7 голосов
/ 11 февраля 2014

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

  • ключ
  • Дата
  • вчера
  • Сегодня
  • Завтра
  • День года
  • День полугодия
  • День квартала
  • День месяца
  • день недели
  • Краткое название дня недели
  • Короткое название дня недели CS
  • длинное имя дня недели
  • длинное имя дня недели CS
  • Дней в неделе
  • Дни в месяце
  • дней в квартале
  • дней в полугодии
  • дней в году
  • Обратный день недели
  • Обратный день месяца
  • Обратный день квартала
  • Обратный день полугодия
  • Обратный день года
  • Последние 7 дней
  • Последние 14 дней
  • Последние 30 дней
  • последние 90 дней
  • последние 180 дней
  • последние 365 дней
  • Является ли будний день
  • Выходные
  • Рабочий день недели
  • Рабочий день месяца
  • Рабочий день квартала
  • Рабочий день полугодия
  • Рабочий день года
  • Обратный рабочий день недели
  • Обратный рабочий день месяца
  • Обратный рабочий день квартала
  • Обратный рабочий день полугодия
  • Обратный рабочий день года
  • Рабочие дни в неделю
  • Рабочие дни в месяце
  • Рабочие дни в квартале
  • Рабочие дни в полугодии
  • Рабочие дни в году
  • последний рабочий день недели
  • последний рабочий день в месяце
  • Рабочий день
  • Это праздник
  • это будущее
  • Прошло
  • предыдущий месяц
  • Текущий месяц
  • следующий месяц
  • это месяц к дате
  • начало месяца
  • Конец месяца
  • Прошлый месяц
  • Начало месяца
  • Конец месяца
  • Номер месяца
  • Название месяца Long
  • Название месяца Длинный CS
  • Короткое название месяца
  • Название месяца, короткое название CS
  • Месяц квартала
  • Полугодие
  • Предыдущая неделя
  • текущая неделя
  • это следующая неделя
  • Неделя к дате
  • начало недели
  • Конец недели
  • Прошлая неделя
  • Начало недели
  • Конец недели
  • Номер недели
  • Неделя длинная
  • Недельное название недели
  • Неделя месяца
  • Предыдущий квартал
  • Текущий квартал
  • следующий квартал
  • Четверть на сегодняшний день
  • начало квартала
  • Конец квартала
  • Прошлый квартал
  • Начало квартала
  • Конец квартала
  • Квартальный номер
  • Название квартала Длинное
  • Четверть Имя Длинный CS
  • Сокращенное наименование квартала
  • предыдущий полугодие
  • Текущий полугодие
  • следует за полугодием
  • полугодия до настоящего времени
  • начало полугодия
  • Конец полугодия
  • Прошло полугодия
  • начало полугодия
  • Конец полугодия
  • Полугодовой номер
  • Полугодовое имя длинное
  • Полугодовое имя длинный CS
  • Полугодовое имя короткое
  • Предыдущий год
  • Текущий год
  • следующий год
  • Год с даты
  • Начало года
  • Конец года
  • Прошлый год
  • Начало года
  • Конец года
  • Номер года
  • Название года Длинный
  • Краткое название года
  • Текст четверть года
  • Год Месяц День
  • Год Полугодие
  • Квартал года
  • Год Месяц
  • Год День Года
  • високосный год
  • Расстояние в днях от сегодняшнего дня
  • Расстояние в рабочих днях от сегодняшнего дня
  • Расстояние в календарных неделях от сегодняшнего дня
  • Расстояние в календарных месяцах от сегодняшнего дня
  • Расстояние в календарных кварталах от сегодняшнего дня
  • Расстояние в календарном полугодии от сегодняшнего дня
  • Расстояние в календарных годах от сегодняшнего дня
  • N-й день недели в месяце
  • Обратный N-й день недели в месяце

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

1 голос
/ 09 августа 2013

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

1 голос
/ 31 марта 2013

Хорошо, Радж Море, это хороший пост и очень полезный скрипт для создания календаря, Другие поля, которые вы можете включить в ту же таблицу, могут быть 1) четверть года 2) IsWeekend 3) Выходной день

...