日期维度是什么
日期维度表把每一个自然日预先建成一行,携带年、季、月、周、财季、节假日、工作日标记等属性。事实表统一用日期键关联它,而不是在各处手写日期函数与口径判断。好处是口径集中、跨表可比:周从周几开始、财年怎么切、节假日算不算工作日,只在维表里定义一次。日期维度通常预先一次性生成十几年的行。
基本信息
| 主键 | 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 日为起点,两种口径在年初年末会差出一周。维表里同时提供两列并标明用途,比事后解释数字为何对不上更省事。
预生成范围要留足未来年份,且必须包含未知日期成员;事实表若直接存裸日期而非日期键,节假日口径变更时无法集中修正,只能回刷全部事实。