数据仓库的日历表

时间:2009-07-29 17:36:40

标签: sql-server data-warehouse

对于我的数据仓库,我正在创建一个日历表,如下所示:

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 个答案:

答案 0 :(得分:10)

  • 财务/会计年度
  • 财务/会计季度
  • isWeekend
  • isWeekday
  • isWorkDay
  • WeekId(自年初以来的几周)
  • isLastDayofMonth
  • DaysSince(例如自2000年1月1日以来的几天)

答案 1 :(得分:7)

这是我在日历维度中可能列的列表:

  • 关键
  • 日期
  • 昨天是
  • 今天是
  • 明天是
  • 一年中的一天
  • 半年的日子
  • 季度日
  • 日期
  • 星期几
  • 星期几短名称
  • 星期几短名称CS
  • 周长日名称
  • 周长日名称CS
  • 周中的日子
  • 几个月的日子
  • Days in Quarter
  • 半年的日子
  • 年中的日子
  • 周日反转
  • 反转日期
  • 季度逆转日
  • 半年的反向日
  • 年度反转日
  • 过去7天
  • 过去14天
  • 过去30天
  • 过去90天
  • 过去180天
  • 过去365天
  • 是工作日
  • 是周末
  • 周工作日
  • 每月工作日
  • 季度工作日
  • 半年的工作日
  • 年度工作日
  • 周反向工作日
  • 每月反向工作日
  • 季度反向工作日
  • 半年的逆向工作日
  • 年度反向工作日
  • 周工作日
  • 月中的工作日
  • 季度工作日
  • 半年的工作日
  • 年度工作日
  • 周末的最后一个工作日
  • 是月中的最后一个工作日
  • 是工作日
  • 是假日
  • 是未来
  • 过去
  • 是上个月
  • 是本月
  • 是下个月
  • 是月初至今
  • 月初
  • 月末
  • 过去一个月
  • 月初
  • 月末
  • 月份编号
  • 月份名称长
  • 月名长CS
  • 月份名称简短
  • 月名短CS
  • 季度
  • 半年月
  • 是上周
  • 是本周
  • 正在关注一周
  • 是周至今
  • 是周初“
  • 是周结束
  • 过去一周
  • 周初
  • 周结束
  • 周数
  • 周名称长
  • 周名短
  • 每周一周
  • 是上一季度
  • 是当前季度
  • 正在关注季度
  • 是季度至今
  • 是季度开始
  • 是季度结束
  • 过去季度
  • 季度开始
  • 季度结束
  • 季度编号
  • 季度名称长
  • 季名长CS
  • Quarter Name Short
  • 是上半年
  • 现在是半年
  • 是在半年之后
  • 至今年半年
  • 半年开始
  • 半年结束
  • 过去半年
  • 半年初
  • 半年结束
  • 半年号
  • Halfyear Name Long
  • Halfyear Name Long CS
  • 半年名称简短
  • 是上一年
  • 是当年
  • 正在追踪年度
  • 是年初至今
  • 是年初
  • 年终
  • 过去的一年
  • 年初
  • 年终
  • 年号
  • 年名长
  • 年名短
  • 年度季度文字
  • 年月日
  • 年半年
  • 年度季度
  • 年月
  • 年度日
  • 是闰年
  • 今天的距离
  • 今天工作日的距离
  • 今日日历周的距离
  • 今日历月的距离
  • 今日日历区的距离
  • 今日历年半年距离
  • 今日历年的距离
  • 每月的第N天
  • 每月反转的第N天

我创建了交互式spreadsheet,您可以在其中为PostgreSQL数据库创建自己的时间维度。

答案 2 :(得分:1)

好Raj More,它是一个很好的帖子,非常有用的创建日历的脚本, 您可以在同一张表格中包含的其他字段可能是 - 1)QuateroftheYear 2)IsWeekend 3)IsWeekday

答案 3 :(得分:1)

每年的四分之一 year_quarter(2013-3)
一年中的一个月 year_month(2013-08)
一年中的一周 一周的一周 一年中的一天 季度日 一天中的某一天 星期几