Преобразование PeriodStart и PeriodEnd в год + номер недели

Я пытаюсь преобразовать дату начала и окончания в несколько строк, заполненных номерами недель и связанным с ними годом. Моя идея состоит в том, чтобы преобразовать эту дату начала и окончания в SSIS с помощью компонента Script и создать строки для каждой недели, установив для параметра SynchronousInput значение «Нет». Я попытался использовать для этого Timepan, однако это не засчитывается в следующий год при достижении 53-й недели.

Кто-нибудь знает, как это сделать?

Пример:

Вход:

StartDate   EndDate
2014-12-29  2015-02-01

Желаемый результат:

  Year  WeekNr
  2015      1
  2015      2
  2015      3
  2015      4
  2015      5

person Alim    schedule 05.11.2015    source источник
comment
Между 5 и 26 21 день. Как получить 5 недель? Полные недели начинаются в понедельник или в StartDate?   -  person Julien Vavasseur    schedule 05.11.2015
comment
исправил это, но дело в том, чтобы взять номер недели даты (26 января на неделе 5)   -  person Alim    schedule 05.11.2015
comment
05.01.2015 никогда не будет первой неделей, ни в формате ISO, ни в формате США. Возможно, вам следует точно описать, как преобразовать в желаемый результат.   -  person t-clausen.dk    schedule 05.11.2015
comment
на самом деле это неделя 1 по голландскому календарю (время и дата. ком/календарь/)   -  person Alim    schedule 05.11.2015
comment
нет, только что проверил, 05.01.2015 - это вторая неделя в голландском календаре. В соответствии с этим ссылка, кажется, вы используете iso-календарь   -  person t-clausen.dk    schedule 05.11.2015
comment
ммм смотрел не на тот год мой плохой   -  person Alim    schedule 05.11.2015
comment
Я бы построил таблицу календаря - предварительно заполнив ее однократным + ежегодным обслуживанием по мере необходимости, затем присоединившись к ней на основе начала/конца и вытащив предварительно рассчитанные вами номера недель. Это также позволяет вам справляться с различиями в том, как компании просматривают календарь (52 недели против 53 недель). Если вам нужны смежные числа, вы можете использовать функции ранжирования.   -  person Andrew    schedule 05.11.2015


Ответы (1)


Сначала я использовал формулу из здесь, но затем вспомнил, что есть лучший способ использовать sqlserver 2008+, и изменил сценарий, чтобы он был более читабельным:

;WITH N(N)AS 
(SELECT 1 FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))M(N)),
tally(N)AS(SELECT ROW_NUMBER()OVER(ORDER BY N.N)FROM N,N a,N b,N c,N d,N e,N f)
SELECT
  datepart(iso_week, dateadd(week, n-1, @from)) weeknr,
  datepart(year, dateadd(week, datediff(day, -7*n, @from)/7, -4)) Year
FROM TALLY
WHERE
  datediff(ww, dateadd(d, -1, @from), dateadd(d, -1, @to))+1 >= n 

Результат:

weeknr  Year
1       2015
2       2015
3       2015
4       2015
5       2015
person t-clausen.dk    schedule 05.11.2015