T-SQL отображает дату окончания недели при использовании DatePart (ww, Date) - PullRequest
3 голосов
/ 28 июля 2011

У меня есть запрос, в котором я группирую по неделям, используя DatePart (ww, [TimeEntryDate]) для столбца, и он возвращает номер недели.Я хотел бы отобразить дату окончания недели и сделать так, чтобы она всегда была субботой.

Вот полный запрос

SELECT 
DatePart(year , [TimeEntryDate]) [YEAR],
DatePart(ww , [TimeEntryDate]) Week, 
CategoryId, 
SUM(TimeEntryDuration) "Total Hours"

  FROM [TIMETRACKER].[dbo].[aspnet_starterkits_TimeEntry]
  GROUP BY DatePart(year , [TimeEntryDate]),  DatePart(ww , [TimeEntryDate]) , CategoryId 
  ORDER BY 1,2,3

data 
Year    Week   Category  Total Hours
2010     1        1          10
2010     2         1         12

Ответы [ 2 ]

2 голосов
/ 28 июля 2011

Вы можете попробовать следующее

SELECT DatePart(year , [TimeEntryDate]) [YEAR],
       DatePart(ww , [TimeEntryDate]) Week, 
       DATEADD(d, 7 - DATEPART(DW, [TimeEntryDate]), [TimeEntryDate]) as WeekEnding,
       CategoryId, 
       SUM(TimeEntryDuration) "Total Hours"  
  FROM [TIMETRACKER].[dbo].[aspnet_starterkits_TimeEntry]  
 GROUP BY DatePart(year , [TimeEntryDate]),  DatePart(ww , [TimeEntryDate]) , CategoryId 
 ORDER BY 1,2,3

РЕДАКТИРОВАТЬ: Настройки даты начала зависят от ваших языковых настроек.По умолчанию в США используется английский язык 7, воскресенье, но вам необходимо проверить свои настройки и соответствующим образом скорректировать расчет.Вы можете проверить свои настройки, чтобы определить, какой день является началом недели, с помощью

SELECT @@DATEFIRST;

Этот запрос иллюстрирует разницу:

SET LANGUAGE Italian;
GO
SELECT @@DATEFIRST;
GO
SET LANGUAGE us_english;
GO
SELECT @@DATEFIRST;

Вы также можете установить дату начала своей недели какследует.

SET DATEFIRST 1
0 голосов
/ 29 июля 2011

Это даст вам дату субботы для любой недели: (любезно предоставлено это сообщение от @mwigdahl)** примечание: вам не нужна функция CONVERT (), но она делает ее более читабельной *

CONVERT(varchar(50), (DATEADD(dd, @@DATEFIRST - DATEPART(dw, @date), @date)), 101)

Вот тест, чтобы продемонстрировать это:

DECLARE @date smalldatetime
SET @date = '7/1/11'

DECLARE @week int
SET @week = datepart(ww, @date)

WHILE @week <= 32 --just to take the test through July
BEGIN
   SELECT 
        @week, 
        @date,
        CONVERT(varchar(50), (DATEADD(dd, @@DATEFIRST - DATEPART(dw, @date), @date)), 101)
    SET @date = @date + 1
    SET @week = datepart(ww, @date)
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...