askmewhat (9/17/2012)
sorry last request... if Sunday were to be added on there? So both Saturday and Sunday.
He is one for you, it can count any number of selected week days separately and summarised:
DECLARE @year int
DECLARE @DaysToCount VARCHAR(7) -- any combination of 1234567 as per Monday (1) to Sunday (7)
SET @year = 2015
SET @DaysToCount = '357' -- to count Wednesdays, Fridays and Sundays
;WITH ym
AS
(
SELECT CAST(CAST(@year * 100 + m.m AS CHAR(6)) + '01' AS datetime) mfd
FROM (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) m(m)
)
, dc
AS
(
SELECT CAST(d-1 AS DATETIME) AS wd
FROM (VALUES (1),(2),(3),(4),(5),(6),(7)) d(d)
WHERE CHARINDEX(CAST(d AS VARCHAR(1)), @DaysToCount,1) > 0
)
-- if you want just a SUM of selected week days per month USE THIS QUERY:
SELECT
MONTH(mfd) AS MonthNo
,DATENAME(MONTH,mfd) AS MonthName
,SUM(DATEDIFF(DAY, wd, DATEADD(DAY, -1, DATEADD(MONTH, 1, mfd))) / 7 -
DATEDIFF(DAY, wd, DATEADD(DAY, -1, mfd)) / 7 ) AS NoOfSelectedWeekDays
FROM ym
CROSS JOIN dc
GROUP BY mfd
ORDER BY mfd
-- if you want list of WeekDays per Month for each week day separately uncomment and
-- USE THIS QUERY instead of above one:
/*
SELECT
MONTH(mfd) AS MonthNo
,DATENAME(MONTH,mfd) AS MonthName
,DATENAME(WEEKDAY,wd) AS WeekDay
,DATEDIFF(DAY, wd, DATEADD(DAY, -1, DATEADD(MONTH, 1, mfd))) / 7 -
DATEDIFF(DAY, wd, DATEADD(DAY, -1, mfd)) / 7 AS NoOfWeekDays
FROM ym
CROSS JOIN dc
ORDER BY mfd , wd
*/