14

Can someone kindly explain me why these two give different results?

I execute this with PHP.

date("YW",mktime(0, 0, 0, 3, 22 , 2013)); // outputs 201312

And when I execute this with MySQL

SELECT YEARWEEK(now()); // outputs 201311
4

3 回答 3

37

您需要在 mysql YEARWEEK 调用中指定模式 3:

SELECT YEARWEEK(now(),3); 

PHPdate()占位符W根据ISO 8601 规范返回周数。这意味着周从星期一(不是星期日)开始,一年中的第一周是第 1 周(不是 0),并且该周是第一个在新年中有超过一半天数的周(所以它必须是一月星期四)。根据MySQL WEEK 函数的文档,该选项组合是模式 3。

此外,将 Alles 的注释拉到接受的答案中,因为它很重要:占位符YW不要放在一起。如果您想要与 ISO 周数一起使用的年份,您应该使用o而不是Y. 例如,考虑从 2014 年 12 月 29 日星期一开始的那一周:

date('YW', mktime(0,0,0,12,29,2014));  #=> 201401 : 1st week of 2014??
date('oW', mktime(0,0,0,12,29,2014));  #=> 201501 : better
于 2013-03-22T03:43:47.070 回答
18

请注意 YEARWEEK('2012-01-01', 3) => 201152 而 PHP "YW" 将给出 201252。结果中的年份可能与第一个和最后一个日期参数中的年份不同一年中的一周。(即 YEARWEEK 中的年份是一周中星期一的年份,而不是用于计算的日期的年份)。

为了得到正确的结果,你需要做

date("oW",mktime(0, 0, 0, 1, 1, 2012)); // outputs 201152

因为“o”给你一周所属的年份。

我希望这有帮助。

于 2013-03-24T23:32:45.813 回答
3

YEARWEEK接受第二个(可选)参数,指定周的范围 [0-53] 或 [1-53])。

此函数返回日期的周数。WEEK() 的双参数形式使您可以指定星期是从星期日还是星期一开始,以及返回值是否应在 0 到 53 或 1 到 53 的范围内。如果省略 mode 参数,则返回值使用 default_week_format 系统变量。

whiledate(W)是一个始终在 [01-53] 范围内的ISO8601 日期。因此我的猜测是,默认情况下 YEARWEEK 使用 [0-53] 范围。

因此,如果您想获得相同的结果,请尝试使用 1 作为第二个参数YEARWEEK

于 2013-03-22T03:44:44.633 回答