1

У меня есть номер недели и год, и мне нужно отобразить «total for mm/dd/yy to mm/dd/yy в строке моего отчета ssrs. Моя неделя начинается с понедельника. Например, если мой номер недели равен «2», а год - «2010», тогда мне нужно отобразить «итоговые данные за 01/04/2010 по 01/10/2010 в моей колонке ssrs. как это сделать?Поиск начала недели и даты окончания недели

+0

Что диапазон дат недели '1'? Я предпочитаю таблицу календаря для таких задач: http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html – dnoeth

+1

за неделю1 12/28/2009 01/03/2010 –

+0

@AliasVarghese НЕ правильно, iso_week 1 is 2010-01-04 to 2010-01-10 –

ответ

0

Попробуйте

declare @year char(4) = '2010' 
declare @week int = 2 
declare @fromdate datetime 
declare @todate datetime 
set @fromdate = DATEADD(wk, DATEDIFF(wk, 6, '1/1/' + @year) + (@week-1), 7); 
set @todate = DATEADD(wk, DATEDIFF(wk, 5, '1/1/' + @year) + (@week-1), 6) ; 
;WITH dates AS 
(
    SELECT CONVERT(datetime,@fromDate) as Date 
    UNION ALL 
    SELECT DATEADD(d,1,[Date]) 
    FROM dates 
    WHERE DATE < @toDate 
) 
select * from dates 
+1

прочитал вопрос, вот как я знаю –

+1

снова проверил ваш ответ, он не возвращает правильный результат –

+0

** ПОЖАЛУЙСТА **! a) Этот anser неверен, b) и это ужасно! declare @year char (4) '==> Давай, это худший стиль! –

-1

Я надеюсь, что это помогает:

declare @year char(4) = '2014' 
declare @week int = 2 
select dateadd(week,@week,convert(date,@year+'-01-01',121)) 

Изменение формата даты подходящий для вас из этого list

0

SQL Server имеет DATEPART функцию, которая вычисляет порядковый номер недели года. Однако перед этим нужно позвонить DATEFIRST, чтобы определить, какой день недели представляет собой начало недели. В вашем случае вы заявили, что начало вашей недели - понедельник (т. Е. 1).

SET DATEFIRST 1; 

SELECT SUM([your data column]) 
FROM [your table] 
WHERE DATEPART(WEEKNUM, [your date column])=[your week parameter] 
AND DATEPART(YEAR, [your date column])=[your year parameter] 
+0

Я не понимаю, почему вы получаете downvote, я проголосовал за вас. Вы используете 'datefirst' (bravo!) И' datepart' (bravo!), И не все, что дерьмовые хаки, которые другие пишут. Только он хотел видеть и начало и конец недели. этого не хватает, но это немного. –

+0

Привет, я тоже не понял! :) – TeamTam

0

Ваше описание не является американским стандартом, ни isoweek. Похоже на смесь этих. Я никогда не слышал об этом как о стандарте. Это почти isoweek. Вот на что основан этот ответ.

Расчет изо год немного сложнее, вы можете прочитать об этом here:

Это синтаксис вам нужно:

DECLARE @year int = 2010 
DECLARE @week int = 2 
;WITH CTE AS 
(
    SELECT 
     dateadd(wk, datediff(wk, - @week * 7, 
     cast(cast(@year as char(4)) as datetime) - 5), 0) startofweek 
) 
SELECT 
    replace('total for ' + convert(char(10), startofweek, 110) 
    + ' to ' + convert(char(10), dateadd(day, 6, startofweek) , 110), '-', '/') 
FROM CTE 

Результат:

total for 01/11/2010 to 01/17/2010 

Isoweek 2 в 2010 году is 2010-01-11

+0

Это не то же определение, что и неделя ИСО, 01/04/2010 находится в ИСО неделя 1 :-) – dnoeth

+0

@ Если вы правы. изменил мой код –

0

Попробуйте установить DATEFIRST ())

SET DATEFIRST 7 

declare @wk int 
declare @yr int 
declare @EndOfWeek as datetime 

set @wk = 2 
set @yr = 2010 


SET @EndOfWeek = dateadd (week, @wk, dateadd (year, @yr-1900, 0)) + 1 - datepart(dw, dateadd (week, @wk, dateadd (year, @yr-1900, 0))) 

SELECT 
    replace('total for ' + convert(char(10), dateadd(day, -6, @EndOfWeek) , 110) 
    + ' to ' + convert(char(10), @EndOfWeek, 110), '-', '/') 

Результат:

total for 01/04/2010 to 01/10/2010 
Смежные вопросы