matrixorigin / matrixorigin/matrixone
[Compatibility]: EXTRACT(WEEK) uses a different week mode from MySQL and WEEK(,0)
- Dominant language
- Go
- Stars
- 1.9k
- Forks
- 311
- Avg merge
- 1d 3h
- Merged PRs (30d)
- 768
Description
## 现象
MatrixOne `main`(`ac660ae56ecd37bab3dd8c61193617a323377029`)的 `EXTRACT(WEEK FROM temporal)` 使用 ISO 风格的周编号,而 MySQL 8.0.46 的该表达式与 `WEEK(temporal, 0)` 一致。
```sql
SELECT EXTRACT(WEEK FROM CAST('2000-01-01' AS DATE)),
WEEK(CAST('2000-01-01' AS DATE), 0);
SELECT EXTRACT(WEEK FROM CAST('2024-02-29' AS DATE)),
WEEK(CAST('2024-02-29' AS DATE), 0);
SELECT EXTRACT(WEEK FROM CAST('2024-12-31' AS DATE)),
WEEK(CAST('2024-12-31' AS DATE), 0);
```
```text
date MatrixOne EXTRACT/WEEK(,0) MySQL EXTRACT/WEEK(,0)
2000-01-01 52 / 0 0 / 0
2024-02-29 9 / 8 8 / 8
2024-12-31 1 / 52 52 / 52
```
同样的值差异出现在 `DATETIME` 和 `TIMESTAMP` 列;`2005-01-01`、`2024-01-01`、`2025-01-01` 等年界日期也稳定复现。
## 期望
`EXTRACT(WEEK FROM value)` 应与 MySQL 一致采用默认 week mode 0,并与同一引擎中的 `WEEK(value, 0)` 返回相同周号。
## 代码定位
`pkg/sql/plan/function/func_binary.go` 中 DATE 重载 `ExtractFromDate` 和 DATETIME/TIMESTAMP 辅助路径都调用 `WeekOfYear2()`;而 `WEEK(value,0)` 使用 `Date.Week(0)`。两条路径采用不同算法,导致 `EXTRACT(WEEK)` 在年界和普通日期均偏离默认周模式。
## 复现信息
- MatrixOne main:`ac660ae56ecd37bab3dd8c61193617a323377029`
- MySQL:8.0.46
- DATE、DATETIME、TIMESTAMP 三类输入和 6 个边界日期重复执行 3 次,结果一致
Contributor guide
Assessment
This issue has not been assessed yet.