Должно быть возможно через DatePart
, например:
DECLARE @intEmployeeCode INT = 2309
DECLARE @StartDate datetime;
DECLARE @EndDate datetime;
DECLARE @Month int
DECLARE @Year int
SET @Month = month(getdate()) + 2
SET @Year = year(getdate())
SET @StartDate = (select DATEADD(month,month(getdate())-1,DATEADD(year,year(getdate())-1900,0)) ) /*First*/
SET @EndDate = (select DATEADD(day,-1,DATEADD(month,@Month,DATEADD(year,@Year-1900,0))) )/*Last*/
;WITH cte AS (
SELECT
CAST(CAST (@StartDate AS NVARCHAR) AS date) AS myDate
UNION ALL
SELECT DATEADD(day,1,myDate) as myDate
FROM cte
WHERE DATEADD(day,1,myDate) <= CAST(CAST (@EndDate AS NVARCHAR) AS date)
),
cteWeekwise AS(
SELECT myDate ,datename(dw,myDate) AS DayOfDate, DATEPART(YEAR, myDate) cwYear, DATEPART(MONTH, myDate) cwMonth, DATEPART(WEEK, myDate) cw, DENSE_RANK() OVER(PARTITION BY DATEPART(YEAR, myDate), DATEPART(MONTH, myDate) ORDER BY DATEPART(WEEK, myDate)) WeekIdx
FROM cte
WHERE datename(dw,myDate) <> 'Sunday'
)
SELECT WeekIdx, cwYear, cwMonth, cw, COUNT(*) cnt
FROM cteWeekwise
--
WHERE cwYear = 2018
AND cwMonth = 5
AND WeekIdx = 5
--
GROUP BY cwYear, cwMonth, cw, WeekIdx
ORDER BY cwYear, cwMonth, cw
OPTION (MAXRECURSION 0);