Дата PHP ('W') против MySQL YEARWEEK (теперь ())

Может кто-то любезно объяснить мне, почему эти два дают разные результаты?

Я выполняю это с помощью PHP.

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

И когда я выполняю это с MySQL

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

Solutions Collecting From Web of "Дата PHP ('W') против MySQL YEARWEEK (теперь ())"

Вам нужно указать режим 3 при вызове mysql YEARWEEK:

 SELECT YEARWEEK(now(),3); 

Флаг date() PHP возвращает номер недели в соответствии со спецификацией ISO 8601 . Это означает, что недели начинаются в понедельник (а не в воскресенье), первая неделя года – номер 1 (не 0), и эта неделя является первой, которая имеет не менее 4 дней в новом году (так что это неделя, содержащая новый первый четверг в четверг). Согласно документации для функции MySQL WEEK , эта комбинация параметров – режим 3.

Кроме того, чтобы вытащить записку Аллеса в принятый ответ, потому что это важно: заполнители Y и W не идут вместе. Если вы хотите год, который идет с номером недели ISO, вы должны использовать o вместо Y Например, рассмотрим понедельник, 29 декабря 2014 года:

 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 

Имейте в виду, что YEARWEEK ('2012-01-01', 3) => 201152, а PHP «YW» даст 201252. Год в результате может отличаться от года в аргументе date для первого и последнего неделя года. (т.е. год в YEARWEEK – это год понедельника недели, а не год, который используется для расчета).

Чтобы получить правильный результат, вам нужно сделать

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

поскольку «o» дает вам Год, на который принадлежит неделя.

Надеюсь, это поможет.

YEARWEEK берет второй (необязательный) параметр, который задает диапазон недели [0-53] или [1-53]).

Эта функция возвращает номер недели для даты. Форма с двумя аргументами WEEK () позволяет указать, начнется ли неделя в воскресенье или понедельник, и должно ли возвращаемое значение находиться в диапазоне от 0 до 53 или от 1 до 53. Если аргумент режима опущен, значение системной переменной default_week_format.

а date(W) – это дата ISO8601, которая всегда находится в диапазоне [01-53]. Поэтому я предполагаю, что по умолчанию YEARWEEK использует диапазон [0-53].

Итак, если вы хотите получить тот же результат, попробуйте использовать 1 в качестве второго параметра для YEARWEEK