Может кто-то любезно объяснить мне, почему эти два дают разные результаты?
Я выполняю это с помощью PHP.
date("YW",mktime(0, 0, 0, 3, 22 , 2013)); // outputs 201312
И когда я выполняю это с MySQL
SELECT YEARWEEK(now()); // outputs 201311
Вам нужно указать режим 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