首页 / 日期
WEEKOFYEAR 一年中的第几周
WEEKOFYEAR 返回日期在一年中的第几周。多数引擎以周一为一周的开始,并按“第一周至少有 4 天”的规则计算,所以 1 月初可能返回 52 或 53。Hologres 用 EXTRACT(WEEK FROM ...),返回 DOUBLE PRECISION;Flink 用 WEEK。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | WEEKOFYEAR(date[, date_part]) | 默认周一为一周的第一天,1 月 1 日所在周有 4 天及以上属于当年时算作第一周。date_part 可以传 week(sunday) 等指定一周的起始日,或传 isoweek。 | 官方文档 |
| Hologres | 需改写 | EXTRACT(WEEK FROM ts) | 也可以用 week_iso(ts),文档说明语义与 EXTRACT(WEEK FROM ts) 相同、性能更好。返回 DOUBLE PRECISION。 | 官方文档 |
| StarRocks | 支持 | WEEKOFYEAR(date) | 返回 INT。文档没有说明周的划分规则;需要 ISO 周时可以用 week_iso。 | 官方文档 |
| Doris | 支持 | WEEKOFYEAR(date) | 周一为一周的开始,一周中有 4 天及以上在当年时算作当年的周,返回 1~53,与 MySQL 的 weekofyear 一致。 | 官方文档 |
| Hive | 支持 | weekofyear(string date) | 返回 INT,可以传入日期或时间戳字符串。 | 官方文档 |
| Spark SQL | 支持 | weekofyear(date) | 周一为一周的开始,第一周是第一个超过 3 天的周。 | 官方文档 |
| Flink SQL | 别名 | WEEK(date) | 返回 1~53,等价于 EXTRACT(WEEK FROM date)。 | 官方文档 |
迁移注意事项
- 跨年时周序号会“回绕”:1 月 1 日可能属于上一年的第 52 或 53 周,12 月底也可能是下一年的第 1 周。按 year(dt) 和 weekofyear(dt) 组合分组时,跨年那几天会被分到错误的周。
- Hologres 的 EXTRACT 返回 DOUBLE PRECISION,直接拼接字符串会得到 12.0 这类结果,需要先 CAST 成整数。
- StarRocks 文档没有写明 WEEKOFYEAR 的周规则。需要和其他引擎对齐时,建议改用 week_iso 并实测。
- MaxCompute 可以通过第二个参数改成周日开始,其他引擎的 WEEKOFYEAR 没有这个参数。
示例
按周汇总订单量
SELECT WEEKOFYEAR(order_date) AS wk, COUNT(*) FROM orders GROUP BY WEEKOFYEAR(order_date);SELECT CAST(EXTRACT(WEEK FROM order_date) AS INT) AS wk, COUNT(*) FROM orders GROUP BY 1;SELECT WEEKOFYEAR(order_date) AS wk, COUNT(*) FROM orders GROUP BY WEEKOFYEAR(order_date);SELECT WEEKOFYEAR(order_date) AS wk, COUNT(*) FROM orders GROUP BY WEEKOFYEAR(order_date);SELECT weekofyear(order_date) AS wk, COUNT(*) FROM orders GROUP BY weekofyear(order_date);SELECT weekofyear(order_date) AS wk, COUNT(*) FROM orders GROUP BY weekofyear(order_date);SELECT WEEK(order_date) AS wk, COUNT(*) FROM orders GROUP BY WEEK(order_date);