Какой режим для MySQL WEEK() соответствует ISO 8601
Какой режим для MySQL WEEK()
функция дает ISO 8601 неделя года? Аргумент 2 из WEEK()
устанавливает режим в соответствии с этой диаграммой:
+--------------------------------------------------------------------+
| Mode | First day of week | Range | Week 1 is the first week ... |
|------+-------------------+-------+---------------------------------|
| 0 | Sunday | 0-53 | with a Sunday in this year |
|------+-------------------+-------+---------------------------------|
| 1 | Monday | 0-53 | with more than 3 days this year |
|------+-------------------+-------+---------------------------------|
| 2 | Sunday | 1-53 | with a Sunday in this year |
|------+-------------------+-------+---------------------------------|
| 3 | Monday | 1-53 | with more than 3 days this year |
|------+-------------------+-------+---------------------------------|
| 4 | Sunday | 0-53 | with more than 3 days this year |
|------+-------------------+-------+---------------------------------|
| 5 | Monday | 0-53 | with a Monday in this year |
|------+-------------------+-------+---------------------------------|
| 6 | Sunday | 1-53 | with more than 3 days this year |
|------+-------------------+-------+---------------------------------|
| 7 | Monday | 1-53 | with a Monday in this year |
+--------------------------------------------------------------------+
Будет ли один из этих режимов давать ISO 8601 неделю года?
Ответы
Ответ 1
В нумерации по ИСО, понедельник - первый день недели, так что сам сужает его до одного из режимов с нечетным номером.
В Википедии:
Существуют взаимно эквивалентные описания недели 01:
- неделя с первым годом в этом году (формальное определение ISO),
- неделя с 4 января в ней,
- первая неделя с большинством (четыре или более) ее дней в начале года и
- неделя, начинающаяся с понедельника в период с 29 декабря по 4 января.
Третье из этих описаний соответствует "более трех дней в этом году" из таблицы выше, поэтому теперь мы сузили ее до 1 или 3.
Наконец, еще из Википедии (выделено мной):
Если 1 января находится в понедельник, вторник, среду или четверг, это на неделе 01. Если 1 января находится в пятницу, субботу или воскресенье, это на 52 или 53 неделе предыдущего года ( нет недели 00).
Следовательно, диапазон должен быть 1-53, а не 0-53. Это, в свою очередь, означает, что правильным режимом является режим 3.
Ответ 2
Я знаю, что этот вопрос старый, но он хорошо позиционируется SEO:)
Поэтому, чтобы сделать ответ более полным - при отображении номера года и недели вы можете использовать это:
DATE_FORMAT(your_date_here, "%x-%v")
он произведет номер недели iso для "% v" (1-53) и правильный номер года для "% x".
Ответ 3
Для Франции вам нужно добавить файл /etc/mysql/my.cnf § [Mysqld]:
default_week_format = 3
Примечание: не работает для YEARWEEK, нужен режим добавления = 3 SELECT YEARWEEK (CURDATE(), 3)
Наполеон против Франции, действующий в качестве модификатора, и, возможно, в силу того,
default_week_format = 3
Cela permet à la fonction НЕДЕЛЯ de retourner les vraies numéros de semaines Française.
Внимание для участия YEARWEEK il faut impérativement ajouter le mode à 3
SELECT YEARWEEK (CURDATE(), 3)