MySql 和 PHP 的一年中的星期格式不同

Week of year format is different on MySql and PHP

我正在尝试使用相同的日期与 PHP(Carbon - laravel)和 MySql 获得相同的搜索编号。在年底,PHP returns 第 53 周和 Mysql,使用相同的日期,returns 52 但都从第 1 周开始,这怎么可能?

这是一个例子:

相同的日期,不同的输出:

PHP:

$phpDate = Carbon::create('2020','12','31');
dd($phpDate->format('W'));
//output - 53

MySql

select DATE_FORMAT("2020-12-31", '%V') from aRandomTable
//output 52

然后我质疑,也许MySQL是从零开始的,但后来我又试了一次:

PHP:

$phpDate = Carbon::create('2021','01','05');
dd($phpDate->format('W'));
//output - 01

MySQL

select DATE_FORMAT("2021-01-05", '%V') from aRandomTable
//output - 01

并且都从第 1 周开始。

为什么会这样?我该如何解决这个问题?

要了解差异的来源,我们需要看一下这些函数如何计算周。

MySQL DATE_FORMAT docs 关于 %V 的说法如下:

Week (01..53), where Sunday is the first day of the week

PHP DateTime::format docs 关于 W 的说法如下:

ISO-8601 week number of year, weeks starting on Monday

所以你可以看到他们没有使用相同的开始日期。要对此进行修改,您需要将 SQL 更改为使用 %v(小写)作为格式或 WEEKOFYEAR 函数。

它们不同的原因是因为在 PHP 日期格式中,当您使用 W 时,您会得到 ISO-8601 年中的周数(从星期一开始的周数),而在 mysql 中,要获得相同的周数(周从星期一开始),您需要 v(小写)。如果您使用 V(大写),您将获得从周日开始的周

在mysql上使用SELECT WEEKOFYEAR('2020-12-31'),你会得到53,或者使用select DATE_FORMAT("2020-12-31", '%v')和小写的v,你会得到53