SQL Server - напишите запрос, который группирует данные за неделю с Пт-> Чт - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь отделить данные в моей базе данных от Чт-> Пт следующим образом:

(Get last 10 weeks of data, grouped by Fri->Thurs as a week) e.g if today was 8/13/2018:

From (Fri)  To (Thur)
---------------------
8/10/2018   8/16/2018
8/3/2018    8/9/2018
7/27/2018   8/2/2018
7/20/2018   7/26/2018
7/13/2018   7/19/2018
7/6/2018    7/12/2018
6/29/2018   7/5/2018
6/22/2018   6/28/2018
6/15/2018   6/21/2018
6/8/2018    6/14/2018

Я попытался сделать это, написав запрос (более сложный, чем мне нравится):

WITH Vars (d)
AS (
  SELECT DATEADD(week,-9, (DATEADD(day, - ((Datepart(WEEKDAY,GETDATE()) +1) %  7) , GETDATE()))  ) As 'd' 
)
SELECT WeekNum+1  As [WeekNum], Count(*) Count
FROM
(
 SELECT (Datepart(Week, (DATEADD(day, - ((Datepart(WEEKDAY,t.DateField)+1 ) %  7), t.DateField)) ) )as WeekNum
 FROM Table as t
 WHERE (SELECT d FROM Vars) <= t.DateField

) as table

GROUP BY WeekNum
ORDER BY WeekNum ASC

Но он сгруппирован по неправильным датам

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

ПРИМЕЧАНИЕ Я хочу, чтобы это былозапрос, а не хранимая процедура любого рода, если это возможно.

1 Ответ

0 голосов
/ 21 сентября 2018

Проблема в вашем запросе DATEPART(WEEKDAY,....Возвращаемый день недели зависит от ваших региональных настроек и, скорее всего, использует воскресенье в качестве начала недели.

Чтобы рассчитать самую последнюю пятницу, вы можете использовать такое выражение (которое не зависит от региональных настроек):

DATEADD(week, DATEDIFF(day, 4, GETDATE())/7, 4)

При этом используется тот факт, что «дата 0» SQL Server - 01.01.1900 (понедельник), поэтому «дата 4» - 1/5/1900 (пятница).), а также использует DATEDIFF, возвращающий целое число, поэтому деление на 7 представляет собой целочисленное деление .

Предполагая, что ваш WeekNum работает как нужно, особенно после смены годазапрос можно изменить следующим образом:

SELECT DATEPART(week, Friday)+1 AS WeekNum, COUNT(*) AS [Count]
FROM
(
  SELECT DATEADD(week, DATEDIFF(day, 4, t.DateField)/7, 4) AS Friday
  FROM [Table] t
  WHERE t.DateField >= DATEADD(week, DATEDIFF(day, 4, GETDATE())/7-9, 4)
) AS [table]
GROUP BY Friday
ORDER BY Friday

Кроме того, вы можете легко отобразить даты, если хотите:

SELECT Friday, DATEADD(day, 6, Friday) AS Thursday, COUNT(*) AS [Count]
FROM ... -- same as above
...