首页/数据/数仓建模速查/日期维度表设计
维度与事实设计149 条

日期维度表设计

预生成日期维度(含节假日、财季、周口径标记),事实表统一按日期键关联,避免在各处手写日期函数与口径。

数仓建模速查数据更新于 2026-10-13

日期维度是什么

日期维度表把每一个自然日预先建成一行,携带年、季、月、周、财季、节假日、工作日标记等属性。事实表统一用日期键关联它,而不是在各处手写日期函数与口径判断。好处是口径集中、跨表可比:周从周几开始、财年怎么切、节假日算不算工作日,只在维表里定义一次。日期维度通常预先一次性生成十几年的行。

基本信息

主键date_key,如 20261011 的 int 或 yyyy-MM-dd
预生成范围通常覆盖近 10 年与未来 5 到 10 年
必备属性年、季、月、日、周、星期几、是否周末
业务属性节假日、调休工作日、财季、大促标记
周口径必须显式标注 ISO 周还是自然周
空值处理保留未知日期成员(如日期键 -1)

典型使用场景

  • 事实加载:所有交易、日志类事实统一用日期键关联,不直接存裸日期
  • 同比环比:按年季月周分组,口径由维表属性决定,不必写表达式
  • 节假日分析:零售与出行分析要区分法定假日、调休工作日与周末
  • 财季报表:财务口径的财年切分与自然年不同,集中在维表里表达
  • 周报对齐:跨部门比较同一周的指标,必须都用同一种周口径
  • 活动归因:把大促日期打在维表上,长期复用而不必每次临时拼日历

生成示例

生成示例
-- 用日期序列一次性生成,避免逐日补
INSERT INTO dim_date
SELECT cast(date_format(dt,'yyyyMMdd') as int)   AS date_key,
       dt                                        AS date_value,
       year(dt)                                  AS year_no,
       quarter(dt)                               AS quarter_no,
       date_format(dt,'yyyy-MM')                 AS month_id,
       weekofyear(dt)                            AS week_no,
       dayofweek(dt)                             AS weekday_no,
       case when dt in ('2026-10-01') then 1 else 0 end AS is_holiday
FROM   date_series
WHERE  dt BETWEEN '2016-01-01' AND '2036-12-31';

-- 未知日期成员:事实表日期无法识别时挂这一行
-- INSERT INTO dim_date VALUES (-1, NULL, -1, -1, 'UNKNOWN', -1, -1, 0);

常用属性读法

属性含义用途
year_no自然年年度汇总、同比
fiscal_year财年,起始月按公司定义财务报表口径
week_no / iso_week自然周或 ISO 周周报对齐,混用会错一周
is_holiday法定节假日标记零售、出行量分析
is_workday调休后的实际工作日人效、产能计算
is_promo大促或活动日活动归因、剔除干扰
周口径是跨部门对账最常见的偏差来源:ISO 周以周一为起点、第 1 周含 1 月 4 日,自然周则以 1 月 1 日为起点,两种口径在年初年末会差出一周。维表里同时提供两列并标明用途,比事后解释数字为何对不上更省事。
预生成范围要留足未来年份,且必须包含未知日期成员;事实表若直接存裸日期而非日期键,节假日口径变更时无法集中修正,只能回刷全部事实。

易错点

  • 各表各自计算周口径:同一周在两个报表里覆盖不同日期,跨表对比整体错位
  • 没有节假日与调休属性:大促与假期分析每次临时拼日历,口径随人而变
  • 预生成范围没留未来年份:跨年时维表缺行,事实关联不上出现大量空值
  • 日期键用 int 但格式不统一(20261011 与 1011 混用):关联与分区裁剪同时失效
  • 事实表直接存裸日期字符串:节假日或周口径调整后无法集中修正,只能全量回刷事实

数据来源与参考

  • 数据仓库工具箱:日期维度
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌