【问题标题】:Week of year format is different on MySql and PHPMySql 和 PHP 的年份格式不同
【发布时间】:2021-05-02 11:47:32
【问题描述】:

我正在尝试使用 PHP(Carbon - laravel)和 MySql 使用相同的日期获得相同的搜索编号。年底,PHP返回第53周,Mysql使用相同的日期返回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 上使用 SELECT WEEKOFYEAR('2020-12-31') 你会得到 53 或使用 select DATE_FORMAT("2020-12-31", '%v')v 小写,你会得到 53
  • 谢谢!发生这种情况是有原因的?将您的评论设置为答案,以便我将其标记为正确

标签: php mysql php-carbon


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    要了解差异来自哪里,我们需要看看这些函数是如何计算星期的。

    MySQL DATE_FORMAT docs%V 说如下:

    星期 (01..53),其中星期日是一周的第一天

    PHP DateTime::format docsW 说如下:

    ISO-8601 一年中的周数,从星期一开始的周数

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多