Запрос на еженедельный отчет

В настоящее время я пишу запрос для создания еженедельного отчета с каждого понедельника до следующего воскресенья.

SELECT top 10 DATEADD(WEEK, DATEDIFF(WEEK, '19000101', mydatefield), '19000101') as EveryMonday, DATEADD(WEEK, DATEDIFF(WEEK, '19000101', mydatefield)+1, '19000101')-1 as EverySunday, count(items) FROM myitemtable GROUP BY DATEADD(WEEK, DATEDIFF(WEEK, '19000101', mydatefield), '19000101') as EveryMonday, DATEADD(WEEK, DATEDIFF(WEEK, '19000101', mydatefield)+1, '19000101')-1 as EverySunday 

против

 SELECT count(items) FROM myitemtable WHERE mydatefield >= '2011/05/30 00.00.000' and mydatefield <= '2011/06/05 23.59.59' 

Что не так с вышеуказанным запросом. В первом и втором запросах счетчики добавляются к другому номеру.

Без особого понимания запроса (поскольку я обычно пишу в гораздо более стандартном варианте SQL, чем использует tsql), моя реакция кишки, когда вы смотрите на ваш запрос, заключалась в том, что это может быть проблемой часового пояса. Но, что вам нужно сделать, это проверить, какие ответы вы получаете, это то, что вы ожидаете. Для этого запустите:

 SELECT mydatefield, DATEADD(WEEK, DATEDIFF(WEEK, '19000101', mydatefield), '19000101') as EveryMonday, DATEADD(WEEK, DATEDIFF(WEEK, '19000101', mydatefield)+1, '19000101')-1 as EverySunday FROM myitemtable WHERE mydatefield >= '2011/05/30 00.00.000' and mydatefield <= '2011/06/05 23.59.59' 

если это слишком много данных, вот еще один вариант:

 SELECT min(mydatefield),max(mydatefield),count(*), DATEADD(WEEK, DATEDIFF(WEEK, '19000101', mydatefield), '19000101') as EveryMonday, DATEADD(WEEK, DATEDIFF(WEEK, '19000101', mydatefield)+1, '19000101')-1 as EverySunday FROM myitemtable WHERE mydatefield >= '2011/05/30 00.00.000' and mydatefield <= '2011/06/05 23.59.59' GROUP BY DATEADD(WEEK, DATEDIFF(WEEK, '19000101', mydatefield), '19000101') as EveryMonday, DATEADD(WEEK, DATEDIFF(WEEK, '19000101', mydatefield)+1, '19000101')-1 as EverySunday 

и связанные с этим:

 SELECT min(mydatefield),max(mydatefield),count(*), DATEADD(WEEK, DATEDIFF(WEEK, '19000101', mydatefield), '19000101') as EveryMonday, DATEADD(WEEK, DATEDIFF(WEEK, '19000101', mydatefield)+1, '19000101')-1 as EverySunday FROM myitemtable GROUP BY DATEADD(WEEK, DATEDIFF(WEEK, '19000101', mydatefield), '19000101') as EveryMonday, DATEADD(WEEK, DATEDIFF(WEEK, '19000101', mydatefield)+1, '19000101')-1 as EverySunday 

Выполнение этих запросов должно помочь вам понять, генерируют ли запросы «EveryMonday» и «EverySunday» ожидаемые значения. Видящие минимальные / максимальные даты помогут вам понять, когда возникают несоответствия.

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