Может ли кто-нибудь объяснить мне, почему эти два дают разные результаты?
Я выполняю это с помощью PHP.
date("YW",mktime(0, 0, 0, 3, 22 , 2013)); // outputs 201312
И когда я выполняю это с MySQL
SELECT YEARWEEK(now()); // outputs 201311
Может ли кто-нибудь объяснить мне, почему эти два дают разные результаты?
Я выполняю это с помощью 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 date()
возвращает номер недели в соответствии с спецификацией ISO 8601. Это означает, что недели начинаются в понедельник (а не в воскресенье), первая неделя года - номер 1 (не 0), и эта неделя является первой, у которой есть как минимум 4 дня в новом году (так это неделя, содержащая новый год первый четверг). Согласно документации для функции MySQL WEEK, эта комбинация параметров - режим 3.
Кроме того, чтобы вытащить Alles в принятый ответ, потому что это важно: заполнители 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.
while date(W)
- это дата ISO8601, которая всегда находится в диапазоне [01-53]. Поэтому я предполагаю, что по умолчанию YEARWEEK использует диапазон [0-53].
Итак, если вы хотите получить тот же результат, попробуйте использовать 1 в качестве второго параметра для YEARWEEK