Часть 1: Установление какой день приходится на который неделю
ISO-8601 объявляет международные стандарты для преобразования дат в неделю числа, и наоборот.
Стандартные недели ISO начинаются в понедельник. Год может иметь 52 или 53 недели.
Существует 4 способа установления, когда начинается 1 неделя:
- Это первая неделя с большинством (4 или более) ее дней в январе.
- Его первый день - понедельник, ближайший к 1 января.
- В нем 4 января. Следовательно, самые ранние сроки - с 29 декабря по 4 января, с 4 по 10 января.
- У него есть первый рабочий день в нем, то есть за исключением субботы, воскресенья и 1 января.
Часть 2: Расчеты Excel
Этот ответ подразумевает, что даты хранятся в виде строк 6-символов.
Сначала определите год и в какой день недели он начнется.
1) Strip the first four characters from the string.`
=left(<cell containing the year+week string>, 4)
2) Prepend "1/1/" to it.
="1/1/"&left(<cell containing the year+week string>, 4)
3) Convert this string to an Excel date
=datevalue(<the last result>)
4) Determine the Weekday of the 1st day of that year.
=weekday(<the last result>)
5) Calculate the Excel date of the first Monday.
=if((<the last result>-4)<0,<the result of step 3>+8-<the last result>, <the result of step 3>+1-<the last result>)
6) Work out how many weeks on from that we are:
=right(<original 6 char year/week string>,2)
7) Convert 6) to a number
=value(<last result>)
8) Add that to the Monday of Week 1
=<result of step 5>+<result of step 7>*7
9) Convert this to a month number
=month(<last result>)
10) Convert this to a month name
=choose(<last result>,"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")
11) Add the year back on
=<lastresult>&" "&<result of 1>
Это дает номер месяца, который содержит понедельник текущей пронумерованной недели.
Если ячейка A1 содержит «201547 то ячейка B1 должна содержать: =CHOOSE(MONTH(IF((WEEKDAY(DATEVALUE("1/1/"&LEFT(A1,4)))-4)<0,DATEVALUE("1/1/"&LEFT(A1,4))+1-WEEKDAY(DATEVALUE("1/1/"&LEFT(A1,4))),DATEVALUE("1/1/"&LEFT(A1,4))+8-WEEKDAY(DATEVALUE("1/1/"&LEFT(A1,4))))+7*(VALUE(RIGHT(A1,2)))),"January","February","March","April","May","June","July","August","September","October","November","December")&" "&LEFT(A1,4)
Если A1 содержит 201547 B1, то возвращается "ноября 2015".
Дальнейшие соображения: Вы можете захотеть сделать его более sophisicated, так что за месяц, заканчивающийся в понедельник не за неделю, начиная с его окончательным понедельник засчитываться как часть месяца. В более общем плане, эта неделя считается только месяцем, так как в месяце есть три или более дня. Или 3 или более его рабочих дней являются частью месяца.
Как бы то ни было, я бы сортировал с рассчитанным месяцем и годом в качестве первичного ключа и кода YYYYMM как вторичный ключ.
Имейте в виду, что «неделя» не сопоставляется непосредственно с «месяцем» последовательно. Как вы собираетесь обрабатывать недели, разделенные на два месяца, например. Понедельник - 30 июня, вторник - 1 июля - в какой месяц вы собираетесь конвертировать на этой неделе? Для этого вам необходимо установить некоторые бизнес-правила.Вам также нужно знать, когда начинается «неделя 1» - нумерация недели может быть связана с * финансовым годом *, а не с календарным годом. – Nathan
Большое вам спасибо за быстрый ответ !! Я дам вам, ребята, знать, как это получилось завтра. – krynil