Trogers96 Ответов: 3

Используйте значение типа ISO_WEEK но начинайте неделю в воскресенье


Я пытаюсь получить свое календарное измерение, чтобы правильно рассчитать недели года, которые ISO_week казались решением, но я нахожусь в США, и наши недели начинаются в воскресенье. Есть ли способ заставить недели начинаться по воскресеньям, все еще имея конец/начало лет, находящихся в правильных неделях, например, как ISO_WEEK вычисляет их? Мое текущее добавление в словарь начинается по воскресеньям, но имеет 53-ю неделю каждый год, потому что у меня нет глубокой формулы. В настоящее время я использую
DATEPART(WW, @CurrentDate) AS week_of_year,

Справочная информация по @CurrentDate будет такой

DECLARE @StartDate DATETIME = '01/04/2010' --Starting value of Date Range
DECLARE @EndDate DATETIME = '01/01/2050' --End Value of Date Range
DECLARE @CurrentDate AS DATETIME = @StartDate
SET @CurrentMonth = DATEPART(MM, @CurrentDate)
SET @CurrentYear = DATEPART(YY, @CurrentDate)
SET @CurrentQuarter = DATEPART(QQ, @CurrentDate)


Что я уже пробовал:

В настоящее время для ISOweek у меня есть:
[isoweek] AS DATEPART(ISO_WEEK, [date_day]),

Date_day - это просто дата
Я тоже пробовал
[iso_week_of_year] TINYINT NULL,
iso_week_of_year = CONVERT(TINYINT, isoweek),

Они просто возвращают недели, начинающиеся в понедельник, как и ожидалось.

3 Ответов

Рейтинг:
2

OriginalGriff

Прежде чем вы начнете это делать, вам нужно определить свои "правила" для номера недели - спецификация ISO очень твердо устанавливает их для недель понедельника: Дата недели ISO - Википедия[^] и сильно зависит от недели, на которую приходится четверг - и в результате "ISO - год" может иметь от 364 до 371 дня в зависимости от первого четверга "календарной" недели, а это означает, что 1 января может быть на 52-й или 53-й неделе предыдущего года или на 1-й неделе "этого" года.

Вам нужно будет сначала точно определить, когда начнется ваш год, и идти оттуда!


Рейтинг:
18

MadMyche

Моя рекомендация состояла бы в том, чтобы просмотреть некоторые методы SQL Server, которые использовались до добавления ISO_Week для выполнения вычислений, а затем создать новую функцию, основанную на слегка измененной версии того, что там есть.

Я бы рекомендовал просмотреть эту статью на Sql Server Central, похоже, что она может работать с таблицей подсчета, которая обычно работает с более высокой производительностью, чем другие варианты.
Простая формула для расчета номера недели ISO - SQLServerCentral[^]


Рейтинг:
11

Trogers96

То, что в конечном итоге сработало, было буквально так просто, что я не могу поверить, что не видел этого раньше...
Просто сдвинуть дату сработало чудесно. По-прежнему приходится проверять данные после длительных периодов времени, но теперь недели начинаются по воскресеньям, а не по понедельникам!

DATEPART(ISO_WEEK, DATEADD(day,+1,@CurrentDate)) AS week_of_year