首页 / 日期
DAYOFWEEK 星期几
DAYOFWEEK 返回日期是星期几。MaxCompute、StarRocks、Doris、Spark 和 Flink 都以周日为 1、周六为 7;Hologres 的 EXTRACT(DOW ...) 以周日为 0,Hive 要用 EXTRACT(dayofweek FROM ...)。需要周一为 1 时,各引擎的写法都要额外换算。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | DAYOFWEEK(date) | 返回 1~7,1 是周日,7 是周六。WEEKDAY(date) 则以周一为 0、周日为 6。 | 官方文档 |
| Hologres | 需改写 | EXTRACT(DOW FROM ts) + 1 | DOW 以周日为 0,所以要加 1 才和其他引擎一致。ISODOW 以周一为 1、周日为 7。 | 官方文档 |
| StarRocks | 支持 | dayofweek(date) | 周日为 1,周一为 2,周六为 7。 | 官方文档 |
| Doris | 支持 | DAYOFWEEK(date) | 别名 DOW。周日为 1,周六为 7,与 MySQL 的 dayofweek 一致。 | 官方文档 |
| Hive | 需改写 | extract(dayofweek FROM ts) | 内置函数文档中没有 dayofweek 函数,Hive 2.2.0 起可以用 extract 取 dayofweek,文档示例中 2016-10-20(周四)返回 5,即周日为 1。 | 官方文档 |
| Spark SQL | 支持 | dayofweek(date) | Spark 2.3.0 起提供,周日为 1,周六为 7。weekday(date) 则以周一为 0、周日为 6。 | 官方文档 |
| Flink SQL | 支持 | DAYOFWEEK(date) | 返回 1~7,等价于 EXTRACT(DOW FROM date)。文档示例中 1994-09-27(周二)返回 3,即周日为 1。 | 官方文档 |
迁移注意事项
- Hologres 的 EXTRACT(DOW ...) 以周日为 0,直接替换 DAYOFWEEK 会让每天都差 1,周日从 1 变成 0。
- “星期几”的编号有三种:DAYOFWEEK 周日为 1;MaxCompute 和 Spark 的 WEEKDAY 周一为 0;Hologres 的 ISODOW 周一为 1、周日为 7。迁移时先确认原 SQL 用的是哪一种。
- 需要“周一为 1、周日为 7”时,可以写成 (DAYOFWEEK(d) + 5) % 7 + 1,在 Hologres 中直接用 EXTRACT(ISODOW FROM d)。
- Hive 的内置函数文档没有 dayofweek,只能用 Hive 2.2.0 起提供的 extract(dayofweek FROM ...)。
示例
筛选周末的订单
SELECT * FROM orders WHERE DAYOFWEEK(order_date) IN (1, 7);SELECT * FROM orders WHERE EXTRACT(DOW FROM order_date) IN (0, 6);SELECT * FROM orders WHERE dayofweek(order_date) IN (1, 7);SELECT * FROM orders WHERE DAYOFWEEK(order_date) IN (1, 7);SELECT * FROM orders WHERE extract(dayofweek FROM order_date) IN (1, 7);SELECT * FROM orders WHERE dayofweek(order_date) IN (1, 7);SELECT * FROM orders WHERE DAYOFWEEK(order_date) IN (1, 7);