时间字段命名规则
时间字段按语义分三类命名:_time 表示事件发生的时刻,值精确到秒,如 create_time、update_time;_date 表示业务日期,只到天,用于按日聚合与对账;dt 专用于分区列,值是 2026-10-12 这样的日期串。三者混用是数仓里最贵的错误之一:把时间戳字段当分区列用,补数与跨天任务会落到错误分区;把分区列命名成 create_time 与业务字段同名,条件写错就直接退化成全表扫描,而 SQL 表面看不出问题。
基本信息
| _time | 事件时刻,精确到秒,如 create_time |
|---|---|
| _date | 业务日期,精确到天,如 order_date |
| dt | 分区列专用,值形如 2026-10-12 |
| 时区 | 必须写进字段注释,避免跨时区解读分歧 |
| 值格式 | 日期 yyyy-MM-dd,时刻 yyyy-MM-dd HH:mm:ss |
| 同名冲突 | 分区列与业务字段重名时改分区列名或改业务字段名,不能共用 |
| 一致性 | 同一含义字段在不同表必须用同一后缀,否则跨表脚本必错 |
典型使用场景
- 明细表同时保留事件时刻与业务日期,一条按事件时间分析、一条按业务日汇总,互不干扰
- 分区列统一叫 dt,调度脚本按参数注入分区值,跨表复用不易写错
- 涉及多时区业务时,时间戳字段在注释里写明时区,避免口径各算各的
- 建 DWS 汇总时用 _date 作为维度,避免把秒级时间戳带进汇总粒度
- 对账时明确区分日志层的 _time 与业务层的 _date,两者相差跨天批次的量并不相同
三类字段并存写法
三类字段并存写法
SELECT order_id,
create_time, -- 2026-10-12 08:31:02 事件时刻
date(create_time) AS order_date, -- 2026-10-12 业务日期(汇总用)
dt -- 分区列,与 order_date 同值
FROM dwd_trade_order_di
WHERE dt = '2026-10-12'; -- 分区裁剪走 dt 常量条件
-- 错误写法:在分区列上做转换,裁剪失效,退化为全分区扫描
-- WHERE date(create_time) = '2026-10-12'后缀逐项读法
| 后缀 | 存什么 | 示例值 | 注意 |
|---|---|---|---|
| _time | 事件时刻,到秒 | 2026-10-12 08:31:02 | 注释里写明时区 |
| _date | 业务日期,到天 | 2026-10-12 | 汇总维度只用它 |
| dt | 分区列 | 2026-10-12 | 跨表必须统一命名 |
| _ts | 数值时间戳 | 1760229062 | 秒或毫秒要在注释里点明 |
分区列与业务字段同名同义时,脚本里按业务字段过滤会被误认为走了分区,实际执行是全表扫描,等到集群资源吃紧才被发现。
时间字段上线后再改名会牵动所有下游 SQL,规范要在建模初期定;已经跑起来的表至少把语义与时区补进字段注释,成本低且立刻有用。