matrixorigin / matrixorigin/matrixone

[Compatibility]: EXTRACT(WEEK) uses a different week mode from MySQL and WEEK(,0)

Open
#28,573 1 comment 0 reactions 1 assignee Claimed by @jiangxinmeng1 View on GitHub
area/compatibility kind/bug needs-triage
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.