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
我正在尝试使用相同的日期与 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