Логически, номер недели ISO - это четверг в этом (григорианском) календарном году.Год ISO недели ISO - это григорианский год, в который попадает четверг этой недели ISO.
В схеме ISO недели всегда содержат 7 дней.Недели начинаются в понедельник, заканчиваются в воскресенье, и дни этой недели пронумерованы 1-7.
Эта схема нумерации в будние дни часто отличается от той, которая возвращается из встроенных WEEKDAY
функций и аналогична в различных пакетах программного обеспечения (или требует определенных настроек базы данных), о чем следует знать.Вам понадобится функция, которая возвращает день недели определенной даты в соответствии со схемой нумерации ISO.
Первый четверг года может происходить в любом месте в диапазоне с 01 января по 07 января.
Если первый четверг выпадает на 01 января, то первая неделя ISO этого года будет включать дни (29/31 декабря) по сравнению с предыдущим григорианским годом.
Если первый четверг выпадает на 7 января, то последняя неделя ISO предыдущего григорианского года будет включать дни (01/03 января) текущего григорианского года.
Еслипервый четверг приходится на 4 января, затем косвенно первая неделя года начинается с понедельника 01 января.
Чтобы разработать алгоритм, проще всего определить, какой день недели 04 января.попадает в данный год, затем примените следующий расчет 4 - weekday
.Если будет установлено, что день недели с 04 января - четверг, результат будет 0. Если это понедельник, результат будет 3 (4-1).Если это воскресенье, результат будет -3 (4-7).Мы сохраним это смещение для использования после следующего шага.
Мы можем получить предварительное смещение дня года из чисел недели и дня ISO следующим образом: (((iso_week - 1) * 7) - (4 - iso_day))
.
Затем мы применяем смещение, полученное на первом этапе, к окончательному смещению дня года.Это смещение от 04 января данного григорианского года.Это смещение может быть минусом, если соответствующий день выпадает до 04 января данного года.
Учитывая это смещение дня, мы можем затем использовать встроенные функции для получения 04Январь данного года и применение смещения дня года, чтобы получить окончательную григорианскую дату.
Например, дано 2019-W01-1.
2019-01-04 - пятница, поэтому день недели равен 5. Результат первого шага - -1 (4-5).Результат второго шага -3 (((1-1) * 7) - (4-1)).Вместе взятые, они дают смещение дня года в -4.04 января 2019 года компенсируется на -4, 31 декабря 2018 года.
И вот наш результат: 2019-W01-1 = 2018-12-31.