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

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

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

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

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

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

Ответ 1

Вам нужно указать режим 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

Ответ 2

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

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

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

как "o" дает вам Год, на который принадлежит неделя.

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

Ответ 3

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

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

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

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