PHP date('W')与MySQL YEARWEEK(now())的区别

14

请问为什么这两个结果不同?

我使用PHP执行此操作。

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

当我使用MySQL运行这个时

SELECT YEARWEEK(now()); // outputs 201311
3个回答

37

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

SELECT YEARWEEK(now(),3); 

PHP的date()占位符W根据ISO 8601规范返回周数。这意味着一周始于星期一(而不是星期日),一年的第一周是第1周(而不是第0周),并且该周是新年后半数天数最多的那个星期(所以必须在星期四之前是1月份)。根据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

+1 为答案加一,但如果我想使用 YEARWEEK 按周聚合数据,并且我希望将星期日作为一周的第一天呢?PHP 似乎没有更改一周起始日的选项。 - dzona
这就是第二个参数(“模式”)指定的内容。请阅读文档链接...模式0、2、4和6都从星期日开始,不同之处在于第1周的开始时间以及是否有第0周或第53周。 - Mark Reed
@MarkReed 抱歉,您错过了我的问题。我想要MySQL模式6的PHP等价物。 - dzona
啊,PHP的date函数没有内置支持。你需要自己进行计算。 - Mark Reed

18
请注意,YEARWEEK('2012-01-01', 3) 的结果为201152,而PHP的"YW"将给出201252。在一年中的第一周和最后一周,结果中的年份可能与日期参数中的年份不同。(即YEARWEEK中的年份是该周星期一的年份,而不是用于计算的日期的年份)。
为了获得正确的结果,您需要进行以下操作:
date("oW",mktime(0, 0, 0, 1, 1, 2012)); // outputs 201152

"o" 可以告诉你这一周属于哪一年。

希望对您有所帮助。


感谢这个笔记 - 今天是明年的一周,这个笔记让我避免了很多混乱和潜在的抓狂。 - cincodenada

3

YEARWEEK函数有一个可选的第二个参数,用于指定周的范围[0-53]或[1-53]。

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接