如何向日期维度表添加更多日期数据?
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 行,没什么大不了的。只需在适当的日期运行它即可添加新的年份以上是关于如何向日期维度表添加更多日期数据?的主要内容,如果未能解决你的问题,请参考以下文章