SQL Server. Получите первую дату за неделю, учитывая номер недели?

У меня есть запрос (для использования в bug tracker.net), который вычисляет количество ошибок по неделям по статусу. Но запрос возвращает номер недели, я действительно хочу, это первая дата недели

select datepart(wk, DateAdd(day, 0, DateDiff(day, 0, bg_reported_date))) as [week], bg_status , st_name as [status], count(*) as [count] from bugs inner join statuses on bg_status = st_id group by datepart(wk, DateAdd(day, 0, DateDiff(day, 0, bg_reported_date))), bg_status, st_name order by [week], bg_status 

Часть, которая получает номер недели,

 datepart(wk, DateAdd(day, 0, DateDiff(day, 0, bg_reported_date))) as [week] 

Он возвращает этот результат:

 week bg_status status count ----------- ----------- --------------------------------------------- ------ 22 1 new 1 22 5 closed 32 

Но было бы лучше сказать первую дату каждой недели, например 01-01-2010, затем 08-01-2010 и т. Д.

Вопрос не является дубликатом. Как вы получаете «начальную дату недели» и «дату окончания недели» из номера недели в SQL Server? (ответ говорит, как начать неделю с даты, а не с номера недели)

Не дублировать значение « Рассчитать дату с номера недели» (вопрос запрашивает c #)

Не дублировать Получить первую дату недели с предоставленной даты (вопрос запрашивает javascript)

Я выполнил поиск, но не смог найти ответ на этот вопрос для SQL Server (если это имеет значение в 2010 году)

Если вы думаете об этом правильно, ответ на SO 1267126 может быть применен к вашей проблеме.

Каждая из багов сообщила о датах, которые у вас есть в группе, к той же неделе. Поэтому по определению каждая из этих дат ошибок должна также отображаться в одно и то же начало недели. Таким образом, вы запускаете расчет «начало недели с заданной даты» в датах отчета об ошибках, а также вычисляете число недель и группируете оба (скромно ужасные) выражения и получаете ответ, который вы ищете.

 SELECT DATEPART(wk, DATEADD(day, 0, DATEDIFF(d, 0, bg_reported_date))) [week], DATEADD(dd, -(DATEPART(dw, bg_reported_date)-1), bg_reported_date) AS [weekstart], bg_status, st_name AS [status], COUNT(*) AS [count] FROM bugs INNER JOIN statuses ON bg_status = st_id GROUP BY DATEPART(wk, DATEADD(day, 0, DATEDIFF(day, 0, bg_reported_date))), DATEADD(dd, -(DATEPART(dw, bg_reported_date)-1), bg_reported_date), bg_status, st_name ORDER BY [week], bg_status 

Поскольку bg_reported_date является DATETIME (см. Комментарий, он включает в себя компонент времени), необходимо указать его в DATE перед определением начала недели (но выражение номера недели не требуется, а «день недели» «часть выражения начала недели не нуждается в трансляции):

 SELECT DATEPART(wk, DATEADD(day, 0, DATEDIFF(d, 0, bg_reported_date))) [week], DATEADD(dd, -(DATEPART(dw, bg_reported_date)-1), CAST(bg_reported_date AS DATE)) AS [weekstart], bg_status, st_name AS [status], COUNT(*) AS [count] FROM bugs INNER JOIN statuses ON bg_status = st_id GROUP BY DATEPART(wk, DATEADD(day, 0, DATEDIFF(day, 0, bg_reported_date))), DATEADD(dd, -(DATEPART(dw, bg_reported_date)-1), CAST(bg_reported_date AS DATE), bg_status, st_name ORDER BY [week], bg_status 

NB: Неподтвержденный код!

Я понимаю, что это очень старый поток, но «Получить первую дату за неделю, учитывая номер недели», именно то, что я хотел сделать, и у меня нет фактической даты для работы, поэтому принятый ответ не будет работать меня. Я думал, что отправлю свое решение для потомков. Обратите внимание, что я подозреваю, что разные настройки культуры МОГУТ это сломать, поэтому перед использованием.

Мой ответ строится, начиная с этого .

Предположим, вы знаете номер недели и год, и вы хотите получить даты начала и окончания той недели того года. Вот что я имею:

 --These 2 "declared" variables would be passed in somehow declare @WeekNumber int = DATEPART(wk, GETDATE()) declare @ForYear int = YEAR(GETDATE())-1 --Since we don't have a raw date to work with, I figured I could just start with --Jan 1 of that year. I'll store that date in a cte here, but if you are doing this --in a stored proc or function, it would make much more sense to use another @variable ;with x as ( --this method works in SQL 2008: SELECT CONVERT(DateTime, ('1/1/' + CONVERT(varchar, @ForYear))) as Jan1ForSelectedYear --If you are using 2014 or higher, you can use this instead: --DATETIME2FROMPARTS(@ForYear, 1, 1, 0,0,0,0,0) ) --Now that we have a date to work with, we'll just add the number of weeks to that date --That will bring us to the right week number of the given year. --Once we have THAT date, we can get the beginning and ending of that week --Sorry to make you scroll, but I think this is easier to see what is going on this way SELECT CONVERT(varchar(50), DateAdd(wk, (@WeekNumber - 1), (DATEADD(dd, @@DATEFIRST - DATEPART(dw, x.Jan1ForSelectedYear) - 6, x.Jan1ForSelectedYear))), 101) as FirstDayOfWeekXForSelectedYear, CONVERT(varchar(50), DateAdd(wk, (@WeekNumber - 1), (DATEADD(dd, @@DATEFIRST - DATEPART(dw, x.Jan1ForSelectedYear) , x.Jan1ForSelectedYear))), 101) as LastDayOfWeekXForSelectedYear FROM x 
Interesting Posts

Рекурсивный запрос t-sql

SQL Server: автоматически удалять запись по истечении определенного периода времени?

Проблема производительности сервера Sql с агрегатной функцией

Могу ли я использовать фильтрованный индекс для запроса «недавно измененных» строк

Есть ли причина, по которой я не должен использовать NVARCHAR на Sql Server?

Sql Datetime throw Ошибка преобразования типа данных varchar в datetime

Как я могу вставить уникальный путь HierarchyId, не указывая левого и правого родства?

Использование SQL Profiler для создания файла трассировки в течение нескольких дней

Предложить адрес электронной почты, основанный на имени

Нельзя иметь одинаковые имена таблиц в разных моделях фреймворка сущности?

WHERE при определении последнего времени входа с шаблоном в SQL

Необходимая справка SQL

Лучшая стратегия хранения документов в SQL Server 2008

Использование параметра SQL для оператора в предложении where

Как избежать «|» в SQL Server или T-SQL Query?

Давайте будем гением компьютера.