13

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

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

4 回答 4

10
  • 四分之一
  • 财务/会计年度
  • 财务/会计季度
  • 是周末
  • 是工作日
  • 是工作日
  • WeekId(自年初以来的周数)
  • isLastDayofMonth
  • DaysSince(例如自 2000 年 1 月 1 日以来的天数)
于 2009-07-29T18:43:15.183 回答
7

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

  • 钥匙
  • 日期
  • 是昨天
  • 是今天
  • 是明天
  • 一年中的一天
  • 半年之日
  • 季度日
  • 月份中的某天
  • 星期几
  • 星期几的简称
  • 星期几简称 CS
  • 星期几长名称
  • 星期几长名称 CS
  • 一周中的天数
  • 月中的天数
  • 季度天数
  • 半年的日子
  • 一年中的天数
  • 反转星期几
  • 倒转日期
  • 倒转季度日
  • 半年的逆天
  • 反转一年中的一天
  • 过去 7 天
  • 过去 14 天
  • 过去 30 天
  • 过去 90 天
  • 过去 180 天
  • 过去 365 天
  • 是工作日
  • 是周末
  • 每周工作日
  • 每月工作日
  • 季度工作日
  • 半年工作日
  • 一年中的工作日
  • 倒转工作日
  • 倒转工作日
  • 倒转季度工作日
  • 半年的反向工作日
  • 一年中的反向工作日
  • 每周工作日
  • 每月工作日
  • 季度工作日
  • 半年工作日
  • 一年中的工作日
  • 是一周中的最后一个工作日
  • 是一个月的最后一个工作日
  • 是工作日
  • 是假期
  • 是未来
  • 过去了
  • 是上个月
  • 是当前月份
  • 下个月
  • 是本月至今
  • 是月初
  • 是月底
  • 是过去一个月
  • 月初
  • 月底
  • 月数
  • 月份名称长
  • 月份名称长 CS
  • 月份名称缩写
  • 月份名称 短 CS
  • 季度月份
  • 半年月
  • 是前一周
  • 是当前周
  • 是下周
  • 是本周迄今
  • 是一周的开始
  • 是周末
  • 过去一周
  • 周初
  • 周末
  • 周数
  • 周名长
  • 周名称短
  • 每月的一周
  • 是上一季度
  • 是当前季度
  • 是下一个季度
  • 季度至今
  • 是季度的开始
  • 是季度末
  • 是过去的季度
  • 季度初
  • 季度末
  • 季度编号
  • 季度名称长
  • 季度名称长 CS
  • 季度名称简称
  • 是上半年
  • 是当前半年
  • 是以下半年
  • 半年至今
  • 是半年的开始
  • 是半年结束
  • 已过半年
  • 半年开始
  • 半年结束
  • 半年数
  • 半年名称长
  • 半年名称长 CS
  • 半年简称
  • 是上一年
  • 是当前年份
  • 是下一年
  • 是年初至今
  • 是年初
  • 是年末
  • 是过去的一年
  • 年初
  • 年底
  • 年号
  • 年名长
  • 年份 简称
  • 年季度文本
  • 年月日
  • 年半年
  • 年季度
  • 年月
  • 一年中的一天
  • 是闰年
  • 从今天开始的天数
  • 从今天开始的工作日距离
  • 从今天开始的日历周距离
  • 从今天开始的日历月距离
  • 从今天开始的日历季度的距离
  • 从今天算起日历半年的距离
  • 从今天起历年的距离
  • 每月第 N 天
  • 反转一个月的第 N 天

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

于 2014-02-11T13:37:20.580 回答
1

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

于 2013-03-31T14:58:03.610 回答
1

一年中的季度
year_quarter (2013-3)一年中的
月份year_month (2013-08
)
一年中的
一周 一个月
中的一周 一年中的
一天 季度
的一天 一个月
的一天

于 2013-08-09T04:45:05.993 回答