首页 / 日期
DATETRUNC 日期截断
DATETRUNC 把日期截断到年、月、周等单位的起点,常用于按月汇总。MaxCompute 写 DATETRUNC 且日期在前,其他引擎多为 DATE_TRUNC 且单位在前,Hive 只能用 trunc 截断到月和年。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | DATETRUNC(date, date_part) |
返回类型与输入相同。单位支持 yyyy、q、mm、week、isoweek、dd、hh、mi、ss、ff3,week 默认从周一开始,也可以写 week(sunday)。 | 官方文档 |
| Hologres | 需改写 | DATE_TRUNC('month', ts) |
单位在前,返回 TIMESTAMP 或 TIMESTAMPTZ。 | 官方文档 |
| StarRocks | 需改写 | date_trunc('month', datetime) |
单位在前且必须是常量。DATE 输入只能截断到 year、quarter、month、week、day。 | 官方文档 |
| Doris | 需改写 | DATE_TRUNC(datetime, 'month') |
文档列出两种参数顺序,示例都是日期在前。 | 官方文档 |
| Hive | 需改写 | trunc(date, 'MM') |
函数手册中没有 date_trunc。trunc 只支持 MONTH、MON、MM 和 YEAR、YYYY、YY,返回 string。 | 官方文档 |
| Spark SQL | 需改写 | date_trunc('MONTH', ts) |
date_trunc 从 2.3.0 起提供,单位在前,返回 timestamp。只需要日期时可以用 trunc(date, fmt)。 | 官方文档 |
| Flink SQL | 需改写 | FLOOR(timepoint TO MONTH) |
内置函数中没有 DATE_TRUNC,用 FLOOR ... TO 向下取整到指定单位。 | 官方文档 |
迁移注意事项
- 参数顺序不同:MaxCompute 是日期在前,Hologres、StarRocks 和 Spark 是单位在前,Doris 两种都接受。
- 返回类型不同:MaxCompute 对 DATE 输入返回 DATE,Hologres 和 Spark 的 date_trunc 返回时间戳。结果用于关联 DATE 字段时要先转换。
- 周的起点:MaxCompute 的 week 默认从周一开始,Doris 和 Spark 文档的示例也截断到周一。按周汇总前确认业务定义的周起点。
- Hive 的 trunc 只能截断到月和年,按周、按季度汇总需要自己计算。
示例
取当月第一天
SELECT DATETRUNC(biz_date, 'mm') FROM orders;SELECT DATE_TRUNC('month', biz_time) FROM orders;SELECT date_trunc('month', biz_time) FROM orders;SELECT DATE_TRUNC(biz_time, 'month') FROM orders;SELECT trunc(biz_date, 'MM') FROM orders;SELECT FLOOR(biz_time TO MONTH) FROM orders;