Нулевая неделя

В году 52 недели. Однако, редко первый день года выпадает на первый день недели. Соответственно, очень часто мы начинаем неделю в старом, а заканчиваем уже в новом году. Первым днем недели, в зависимости от региона принято считать либо воскресенье, либо понедельник. Согласно международному стандарту ISO 8601, первым днём недели считается понедельник, а воскресенье — последним. Первой неделей наступающего года принято считать неделю, в которой есть, как минимум, четыре дня этого года. Иначе, неделя относится к текущему году – ведь в ней больше «прошлогодних» дней, чем «новогодних». Такой подход удобен тем, что неделя строго относится либо к текущему, либо к наступающему году.

В системе управления базами данных MySQL для определения номера недели используется стандартная функция WEEK(). Например, 27 декабря 2011 года относится к 52 неделе в году:

mysql> SELECT WEEK('2011-12-27',1); > 52

Дополнительный параметр «1» необходимо указать для того, чтобы первым днем недели считался именно понедельник, а не воскресенье.

Вы всегда можете узнать номер текущей недели в году, при помощи запроса:

mysql> SELECT WEEK( NOW(),1 );

Или вывести из таблицы все данные за текущую неделю:

mysql> SELECT * FROM `table` WHERE `date` = WEEK( NOW( ), 1 );

Однако, функция WEEK() очень строго относится к проверке принадлежности дня к определенной неделе. Так, дни разных годов не могут относиться к одной неделе.

Рассмотрим последнюю неделю 2011 года и первую неделю 2012 года:

 ГОД НД ПН ВТ СР ЧТ ПТ СБ ВС
2011 52 26 27 28 29 30 31 01
2012 01 02 03 04 05 06 07 08

 

Последние 6 дней 2011 года (с 26 по 31 декабря) будут строго принадлежать 52 неделе. Седьмой же день недели, 1 января 2012 года, с точки зрения WEEK(), не может принадлежать ни 52 неделе 2011 года, ни первой неделе 2012 года, так как в ней для этого должно быть хотя бы 4 дня.

Для определения принадлежности дня к «неделе года» используется функция YEARWEEK(), которая возвращает год и номер недели, к которому принадлежит указанный день в формате «ГГГГНД».

Соответственно, для всех дней 52 недели 2011 года (с 26 декабря 2011 по 1 января 2012 включительно) YEARWEEK() возвращает значение «201152», а для первой недели 2012 года – «201201».

Таким образом, 1 января 2012 года принадлежит к 52 неделе года 2011 и «нулевой неделе» 2012 года.

Это можно проверить запросом:

mysql> SELECT WEEK('2012-01-01',1); > 0

Знать о существовании «нулевой недели» важно потому, что при выборке данных за неделю на стыке годов приведет к тому, что данные «нулевой недели» будут отброшены функцией WEEK(). Чтобы избежать таких потерь рекомендуется использовать функцию YEARWEEK().

А в быту определить нулевую неделю просто: день 1 января должен выпасть на пятницу субботу или воскресенье. Теперь, встречая новый год, вы сможете рассказать всем кому пожелаете историю нулевой недели.