【问题标题】:PHP date('W') vs MySQL YEARWEEK(now())PHP date('W') vs MySQL YEARWEEK(now())
【发布时间】:2013-03-11 19:59:45
【问题描述】:

谁能解释一下为什么这两个给出不同的结果?

我用 PHP 执行这个。

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

当我使用 MySQL 执行此操作时

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

【问题讨论】:

    标签: php mysql date week-number


    【解决方案1】:

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

    SELECT YEARWEEK(now(),3); 
    

    PHP date() 占位符W 根据ISO 8601 specification 返回星期数。这意味着周从星期一(不是星期日)开始,一年中的第一周是第 1 周(不是 0),并且该周是第一个在新年中有超过一半天数的周(所以它必须是一月星期四)。根据the documentation for the MySQL WEEK function,选项组合是模式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 似乎没有更改星期开始日期的选项
    • 这就是第二个参数(“模式”)指定的内容。阅读文档链接... 模式 0、2、4 和 6 都在星期天开始一周,不同之处在于第 1 周的时间以及是否有第 0 周或第 53 周。
    • @MarkReed 抱歉,您错过了我的问题。我想要 MySQL 模式 6 的 PHP 等效项
    • 啊。 PHP 的date 函数没有内置支持。你必须自己算算。
    【解决方案2】:

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

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

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

    因为“o”为您提供一周所属的年份。

    我希望这会有所帮助。

    【讨论】:

    • 感谢您的留言 - 今天为我解决了很多困惑和潜在的烦恼,因为今天是明年一周的一部分。
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多