2015-08-09 3 views
0

Мое требование состоит в том, что я хочу найти business-week-ending (а не неделю календаря) с учетом столбца DATE из таблицы продаж в MSSQL.Группа Business Week в SQL (вместо календарной недели)

Используя различные методы, мне удалось найти выходные дни [Календари] (дни недели), соответствующие DATE в таблице.

Поскольку наша рабочая неделя заканчивается в среду [DOW 3 или 4 в зависимости от недели], я попытался вычесть количество дней с даты окончания недели, чтобы вернуть ее в среду. Идея неплохо справилась с недостатком. Работает нормально, пока Date в таблице больше, чем DOW 3 или 4. Любое предложение?

SELECT DateAdd(wk, DateDiff(wk, 0, Recons_Sales_Details.Recons_Date), 0) + 2 
+0

Можете ли вы опубликовать свой код, который вы пробовали? – FutbolFan

+0

Ваш код использует понедельник - воскресную неделю, потому что день ноль (1.1.1900) был в понедельник. Вы можете изменить это, изменив оба значения на одну другую дату, например, четверг –

+0

@JamesZ: 20130102 - Wed. этот код заканчивается неделю в среду. но в то же время он загибается назад 20150801 до выходных 7/29. DateAdd (неделя, DateDiff (неделя, '2013-01-02', Recons_Sales_Details.Recons_Date), '2013-01-02'), – Honda

ответ

0

Вы должны смотреть в SET DATEFIRST сделать это:

SET DATEFIRST 4 --4 is Thursday week start 

SQL Fiddle Demo

+0

** DATEFIRST ** был самым первым привлекательным вариантом, который мне больше всего понравился, однако мои ограничения с этой опцией заключается в том, что на этом сервере (облачном) сервере есть несколько клиентов с различными бизнес-отраслями и географией. И насколько я понимаю, DATEFIRST изменит сервер-календарь. – Honda

+0

@Honda Я не уверен, что 'DATEFIRST' на самом деле изменяет что-либо еще, кроме запуска adhoc-запроса. Так же, как 'SET NO COUNT ON', я считаю, что это относится только к определенному сеансу/транзакции. – FutbolFan