2015-03-24 54 views
1

Прошу прощения, если это дубликат, но я искал час и еще не понял решение.Показать запрос по неделям

Если у меня есть следующий запрос:

SELECT 
[Count]=COUNT([d.ccode]) 
,[Code]=([d.ccode]) 
FROM lntmuid.document d 
WHERE (DateDiff(WEEK, [d.date], GETDATE()) = 237) 
AND staff = 'MF' 
AND ccode = 'SUM' 
GROUP BY d.ccode 

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

╔═════════╦═══════╗ 
║ Week Of ║ Count ║ 
╠═════════╬═══════╣ 
║ 1/1/10 ║ 100 ║ 
║ 1/7/10 ║ 50 ║ 
║ 1/14/10 ║ 80 ║ 
║ 1/21/10 ║ 70 ║ 
║ 1/28/10 ║ 120 ║ 
║ etc … ║  ║ 
╚═════════╩═══════╝ 

Спасибо за помощь

ответ

1

Вы можете получить в первый день недели, используя:

SELECT DATEADD(WEEK, DATEDIFF(WEEK, '19000101', GETDATE()), '19000101'); 

Логика просто получить количество недель между указанной датой (GETDATE() в приведенном выше) и фиксированная дата, затем добавьте это число недель назад к фиксированной дате, а потому, что DATEDIFF только подсчитывает границы недели, это даст вам первый день недели для вашей даты.

Вы тогда просто нужно заменить ваше поле даты в выше, и добавьте выражение группы по статье:

SELECT WeekOf = DATEADD(WEEK, DATEDIFF(WEEK, '19000101', [d.date]), '19000101') 
     ,[Count]=COUNT([d.ccode]) 
FROM lntmuid.document d 
WHERE staff = 'MF' 
AND ccode = 'SUM' 
GROUP BY DATEADD(WEEK, DATEDIFF(WEEK, '19000101', [d.date]), '19000101'); 

Вы также увидите этот метод используется как:

SELECT DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0); 

Это то же самое, но использует неявное преобразование 0 в 1900-01-01 вместо того, чтобы явно вводить его, чтобы сэкономить немного времени. Я склонен использовать этот метод в своем коде, но мне нравится использовать дату, чтобы сделать что-то более понятное для ответов на Stackoverflow.

+0

Спасибо за помощь GarethD, хороший момент на дату –

Смежные вопросы