首页/数据/数仓建模速查/时间字段命名:time/date/dt 区分
分层与规范64 条

时间字段命名:time/date/dt 区分

时间字段命名区分语义:_time 存时间戳(精确到秒)、_date 存日期、dt 专用于分区列;命名不一致会造成分区裁剪失效。

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

时间字段命名规则

时间字段按语义分三类命名:_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,规范要在建模初期定;已经跑起来的表至少把语义与时区补进字段注释,成本低且立刻有用。

易错点

  • 分区列有的叫 pt 有的叫 dt:跨表脚本写错分区名,任务成功但读到空数据
  • 用时间戳字段代替业务日期做分区:跨零点执行与补数时数据落到错误分区
  • 只保留事件时刻不保留业务日期:每次按业务日聚合都要现算,口径在不同脚本里出现分歧
  • 时区未在注释标注:跨时区团队对同一时刻理解不同,看板数字长期对不上
  • 在分区列上套 date() 做过滤:分区裁剪失效,查询扫描全部历史分区

数据来源与参考

  • Hive 官方文档:LanguageManual DDL
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌