2015-10-29 2 views
0

Я пытаюсь суммировать общее количество отработанных часов и группировать их по неделям. Моя неделя начинается в понедельник и заканчивается в воскресенье. Проблема, с которой я сталкиваюсь, состоит в том, что цифры всегда имеют первую неделю, но остальные недели в порядке. Проблема с первой неделей всегда очень низкая.Группировка часов по неделям при использовании SQL

Смотрите снимок

enter image description here

Вот мой код

SELECT 
    UID, 
    CONVERT(VARCHAR, x.WeekBeginDate, 101) as WeekBeginDate, 
    x.TOTAL_HOURS 
FROM 
    (SELECT 
     UID, 
     DATEADD(DD, CONVERT(INT, (DATEDIFF(DD, '1/1/1900', t.DT)/7)) * 7, '1/1/1900') [WeekBeginDate], 
     SUM(HOURS) AS TOTAL_HOURS 
    FROM 
     myTable t 
    WHERE 
     UID = 'test1' 
     AND DT >= DATEADD(WEEK, -6, GetDate()) 
    GROUP BY 
     UID, CONVERT(INT, DATEDIFF(DD, '1/1/1900', t.DT)/7)) x 
ORDER BY 
    1 
+0

Вы можете использовать DATEPART (wk) вместо деления дня на 7. – GendoIkari

+1

Не потому, что ваше время начала - DATEADD (WEEK, -6, GetDate()), который не является понедельником, но в любое время, которое было 6 недель назад, включая часы и минуты. –

+2

Вместо этого супер-оператора создайте календарь таблицу и вычислять через объединения. Вы будете удивлены, как все упростится. –

ответ

2

Попробуйте упростить запрос и получить окна правильно (скрипку: http://sqlfiddle.com/#!3/35c8e/1):

set datefirst 1; --set first day of week to monday 
select 
    DATEADD(DAY,(DATEPART(WEEKDAY, dt) - 1) * -1,dt) as WeekBeginDate, 
    SUM(hours) AS TotalHours 
from hours 
where 
    uid = 'test1' 
    and dt >= CAST(DATEADD(WEEK,-6,DATEADD(DAY,(DATEPART(WEEKDAY, GETDATE()) - 1) * -1,GETDATE())) AS date) 
group by DATEADD(DAY,(DATEPART(WEEKDAY, dt) - 1) * -1,dt) 
Смежные вопросы