簡體   English   中英

數據倉庫的日歷表

[英]Calendar table for 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




這是此命令的輸出



我已經看到數據架構師以各種方式實現了類似的結構。

我的問題是:我可以將哪些其他數據倉庫/維度樣式的有用信息添加到此表結構中?

  • 25美分硬幣
  • 財務/會計年度
  • 財務/會計季度
  • isWeekend
  • isWeekday
  • isWorkDay
  • WeekId(自年初以來的幾周)
  • isLastDayofMonth
  • DaysSince(例如自2000年1月1日以來的幾天)

這是我在日歷維度中列出的可能列:

  • 日期
  • 是昨天
  • 是今天
  • 是明天
  • 一年中的一天
  • 半年的一天
  • 季度日
  • 一個月的一天
  • 星期幾
  • 星期幾短名稱
  • 星期幾短名稱CS
  • 星期幾長名稱
  • 星期幾長名稱CS
  • 星期幾
  • 幾個月的日子
  • 季度的天數
  • 半年的日子
  • 一年中的幾天
  • 反轉日
  • 反轉一個月的日子
  • 反季日
  • 半年的逆轉日
  • 反向日
  • 過去7天
  • 過去14天
  • 過去30天
  • 過去90天
  • 過去180天
  • 是最后365天
  • 是平日
  • 是周末
  • 一周的工作日
  • 一個月的工作日
  • 季度工作日
  • 半年的工作日
  • 一年的工作日
  • 反周工作日
  • 每月逆轉工作日
  • 季度逆轉工作日
  • 半年的逆向工作日
  • 反向工作日
  • 周工作日
  • 一個月的工作日
  • 季度工作日
  • 半年的工作日
  • 一年中的工作日
  • 是周末的最后一個工作日
  • 是最后一個工作日
  • 是工作日
  • 是假日
  • 是未來
  • 是過去
  • 是上個月
  • 是本月
  • 是幾個月
  • 是最新的月份
  • 是月初
  • 是月末
  • 是上個月
  • 月初
  • 月底
  • 月份編號
  • 月份名稱長
  • 月份名稱長CS
  • 月名短
  • 月名短CS
  • 一個月的季度
  • 半年月
  • 是上周
  • 是本周
  • 是在一周之后
  • 是周至今
  • 是周初
  • 是周結束
  • 過去一周
  • 周初
  • 周結束
  • 周數
  • 周名稱長
  • 周名短
  • 每個月的一周
  • 是上個季度
  • 是當前季度
  • 緊隨季度
  • 是季度到目前為止
  • 是季度的開始
  • 是季度結束
  • 是上一季度
  • 季度開始
  • 季末
  • 季度編號
  • 季度名稱長
  • 季度名稱長CS
  • 季度名稱短
  • 是上半年
  • 現在是半年
  • 是在半年之后
  • 半年到目前為止
  • 是半年的開始
  • 是半年結束
  • 過去半年了
  • 半年初
  • 半年結束
  • 半年數
  • 半年名稱長
  • 半年名稱長CS
  • 半年名稱短
  • 是上一年
  • 是當年
  • 是追隨一年
  • 是年初至今
  • 是年初
  • 是年底
  • 是過去的一年
  • 年初
  • 年底
  • 年號
  • 年名稱長
  • 年名短
  • 年度文本
  • 年月日
  • 年半年
  • 年度季度
  • 年月
  • 年度日
  • 是閏年
  • 今天的距離
  • 今天的工作日距離
  • 日歷周的距離從今天開始
  • 今天的日歷月份距離
  • 日歷的距離從今天開始
  • 距今日歷半年的距離
  • 日歷距離今天的距離
  • 月份的第N天
  • 每月反轉N日

我創建了交互式電子表格 ,您可以在其中為PostgreSQL數據庫創建自己的時間維度。

好Raj更多,它是一個很好的帖子和非常有用的腳本創建日歷,其他字段,你可以包括在同一張表中可能是 - 1)QuateroftheYear 2)IsWeekend 3)IsWeekday

四分之一
year_quarter(2013-3)
一年中的一個月
year_month(2013-08)
一周的一周
一周的一周
一年中的一天
季度的一天
一個月的一天
星期幾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM