如何向日期维度表添加更多日期数据?

Posted

技术标签:

【中文标题】如何向日期维度表添加更多日期数据?【英文标题】:How to add more date data to a Date Dimension table? 【发布时间】:2021-12-22 06:40:14 【问题描述】:

我目前正在尝试找出一个 MSSQL 数据库。

很多报告都在使用日期维度表,我可以看到日期在 2022 年 1 月 2 日停止。所以基本上它是一个定时炸弹,我需要在上面再添加几年。

创建此日期维度的人没有超过 2022 年 1 月 2 日。

我想再增加 5 或 10 年。这可以在 SSMS 中完成吗?还是在 Excel 中创建表格,然后导入并替换当前日期维度会更好?

以下是此日期维度表中某些列的示例:

为此增加额外年限的最佳方法是什么? SQL Server v10.5

表结构:

USE [MPH_DWH_Cork_Activity]
GO

/****** Object:  Table [dbo].[bi_dim_date]    Script Date: 11/9/2021 3:06:49 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[bi_dim_date](
    [DateKey] [datetime] NULL,
    [DateInt] [int] NULL,
    [YearKey] [int] NULL,
    [QuarterOfYear] [int] NULL,
    [MPH_MonthOfYear] [int] NULL,
    [MonthOfYear] [int] NULL,
    [DayOfMonth] [int] NULL,
    [MonthName] [varchar](16) NULL,
    [MonthInCalendar] [datetime] NULL,
    [QuarterInCalendar] [varchar](16) NULL,
    [DayOfWeekName] [varchar](16) NULL,
    [DayInWeek] [int] NULL,
    [Week Num] [int] NULL,
    [DateKey1] [datetime] NOT NULL,
    [Year] [int] NULL,
    [YearID] [int] NULL,
    [WeekID] [int] NULL,
    [First Date in Rolling 4 Week Period] [datetime] NULL,
    [Last Date in Rolling 4 Week Period] [datetime] NULL,
 CONSTRAINT [PK__bi_dim_d__6690D80A2A4B4B5E] PRIMARY KEY CLUSTERED 
(
    [DateKey1] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[bi_dim_date] ADD  CONSTRAINT [DF__bi_dim_da__DateI__22401542]  DEFAULT (NULL) FOR [DateInt]
GO

ALTER TABLE [dbo].[bi_dim_date] ADD  CONSTRAINT [DF__bi_dim_da__YearK__2334397B]  DEFAULT (NULL) FOR [YearKey]
GO

ALTER TABLE [dbo].[bi_dim_date] ADD  CONSTRAINT [DF__bi_dim_da__Quart__24285DB4]  DEFAULT (NULL) FOR [QuarterOfYear]
GO

ALTER TABLE [dbo].[bi_dim_date] ADD  CONSTRAINT [DF__bi_dim_da__Month__251C81ED]  DEFAULT (NULL) FOR [MonthOfYear]
GO

ALTER TABLE [dbo].[bi_dim_date] ADD  CONSTRAINT [DF__bi_dim_da__DayOf__2610A626]  DEFAULT (NULL) FOR [DayOfMonth]
GO

ALTER TABLE [dbo].[bi_dim_date] ADD  CONSTRAINT [DF__bi_dim_da__Month__2704CA5F]  DEFAULT (NULL) FOR [MonthName]
GO

ALTER TABLE [dbo].[bi_dim_date] ADD  CONSTRAINT [DF__bi_dim_da__Quart__28ED12D1]  DEFAULT (NULL) FOR [QuarterInCalendar]
GO

ALTER TABLE [dbo].[bi_dim_date] ADD  CONSTRAINT [DF__bi_dim_da__DayOf__29E1370A]  DEFAULT (NULL) FOR [DayOfWeekName]
GO

ALTER TABLE [dbo].[bi_dim_date] ADD  CONSTRAINT [DF__bi_dim_da__DayIn__2AD55B43]  DEFAULT (NULL) FOR [DayInWeek]
GO

ALTER TABLE [dbo].[bi_dim_date] ADD  CONSTRAINT [DF__bi_dim_da__Week __2BC97F7C]  DEFAULT (NULL) FOR [Week Num]
GO

ALTER TABLE [dbo].[bi_dim_date] ADD  CONSTRAINT [DF__bi_dim_dat__Year__2CBDA3B5]  DEFAULT (NULL) FOR [Year]
GO

ALTER TABLE [dbo].[bi_dim_date] ADD  CONSTRAINT [DF__bi_dim_da__YearI__2DB1C7EE]  DEFAULT (NULL) FOR [YearID]
GO

ALTER TABLE [dbo].[bi_dim_date] ADD  CONSTRAINT [DF__bi_dim_da__WeekI__2EA5EC27]  DEFAULT (NULL) FOR [WeekID]
GO

【问题讨论】:

当你有维度表时,通常意味着这些表实际上并不是生产数据,而是一些数据仓库产品在生产之外创建的提取,数据仓库产品应该能够管理这个为你。情况并非总是如此,但它很常见,您应该先看看那里。 【参考方案1】:

通过临时计数表确实是一件小事。如果没有实际的表结构,我们不知道数据类型以及是否计算了列。

也就是说,这是一个简单的例子

Declare @Date1 date = '2022-01-02'
Declare @Date2 date = '2030-12-31'

Select DateKey = D
      ,DateInt = convert(int,convert(varchar(8),D,112))
      ,YearKey = datepart(year,D)
      ,QuarterOfYear = datepart(quarter,D)
      ,MPH_MonthOfYear = '???'
      ,MonthOfYear = datepart(month,D)
      ,DayofMonth  = datepart(day,D)
      ,MonthName   = datename(month,D)
 From (
        Select Top (DateDiff(DAY,@Date1,@Date2)+1) D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),@Date1) 
         From  master..spt_values n1,master..spt_values n2
      ) src

结果

【讨论】:

谢谢,如果这对您有用,我现在已将表结构添加到我的原始帖子中。一年中的 MPH 月份与 MonthOfYear 完全相同。创建此表的人现在已经走了,所以我不确定此列的原因。 @SCool 你有一些工作要做。例如,我看到 YearKey、YearID 和 Year。这些是日历年还是财政年?我上面的答案可以很容易地扩展和调整以满足您的需求。【参考方案2】:

最简单的就是修改原来的脚本运行一个新的周期 如果你没有它,你需要一些时间来重建它 幸运的是,您在 12 月 30 日之前看到了这一点

注意关于一年中的第一周和最后一周的特殊规定 确定您必须遵循的确切规则,这可能很棘手 我不认为 excel 会有很大的帮助,它可以有其他规则而不是你想要遵循的规则

【讨论】:

很遗憾,我找不到原始脚本。 如果我确实找到了原始脚本,你会截断日期表,然后插入新数据吗?我只是想知道解决这个问题的正确过程是什么。 不要删除旧行,您的报告需要时间维度的参考。一年是 365 行,没什么大不了的。只需在适当的日期运行它即可添加新的年份

以上是关于如何向日期维度表添加更多日期数据?的主要内容,如果未能解决你的问题,请参考以下文章

基于链接到维度表之一的事实表中的键添加新维度

数据仓库设计:如何设计交货日期变化的事实和维度表

数据仓库-零售业务举例维度表设计细节-读书笔记

具有不同级别日期维度数据作为日期维度键的事实表

如何定义维度在 ssas 中使用的连接

数据分析SQL日期维度表生成(含节假日)